**Portable Operating System Interface**
---
## 1. POSIX란 무엇인가
**POSIX**는
> _유닉스 계열 운영체제들이 공통으로 따라야 할 동작 규칙을 정의한 표준_이다.
정식 명칭은 **Portable Operating System Interface**이며,
목표는 다음 한 가지다.
> **“같은 프로그램/스크립트가 다른 시스템에서도 동일하게 동작하도록 하자”**
---
## 2. POSIX가 필요한 이유
유닉스 계열 시스템은 매우 다양하다.
- Linux (Ubuntu, Debian, Alpine 등)
- macOS
- BSD
- 상용 Unix (AIX, Solaris 등)
문제는:
- 쉘이 다르고
- 명령어 옵션이 다르고
- 동작 방식이 미묘하게 다르다
👉 **POSIX는 이 혼란을 줄이기 위한 최소 공통 규약**
---
## 3. POSIX가 정의하는 범위
POSIX는 단순히 “쉘 문법”만의 표준이 아니다.
### 3.1 운영체제 인터페이스
- 프로세스 생성/종료 (`fork`, `exec`)
- 파일 디스크립터
- 시그널 (`SIGTERM`, `SIGINT`)
- 권한 모델
### 3.2 쉘(Shell) 표준
- `sh` 문법
- 변수, 조건문, 반복문
- 파이프라인과 리다이렉션
### 3.3 기본 유틸리티
- `ls`, `cp`, `mv`, `rm`
- `grep`, `awk`, `sed`
- `find`, `xargs`
- exit code 규칙 (`0 = 성공`)
---
## 4. POSIX Shell이란?
**POSIX Shell**은
> POSIX에서 정의한 _최소 기능만을 제공하는 쉘 문법_
보통 다음과 같이 사용한다:
```sh
#!/bin/sh
```
의미:
> “이 스크립트는 POSIX 규격만 사용한다”
---
## 5. POSIX vs Bash
### 5.1 Bash는 POSIX인가?
- ❌ Bash = POSIX ❌
- ✅ Bash = POSIX + 확장 기능
즉,
- POSIX 문법 → Bash에서 실행 가능
- Bash 문법 → POSIX 환경에서 **깨질 수 있음**
---
### 5.2 POSIX에서 허용되는 문법
```sh
if [ "$a" = "$b" ]; then
echo "same"
fi
```
```sh
for i in 1 2 3 4 5; do
echo "$i"
done
```
```sh
cmd1 | cmd2 > output.txt 2>&1
```
---
### 5.3 POSIX에서 ❌ 허용되지 않는 문법
```sh
[[ -f file.txt ]] # bash 전용
```
```sh
arr=(a b c) # 배열
```
```sh
for i in {1..5}; do # brace expansion
echo $i
done
```
```sh
source file.sh # POSIX에서는 `. file.sh`
```
---
## 6. /bin/sh의 정체
`/bin/sh`는 시스템마다 다르다.
|시스템|/bin/sh|
|---|---|
|Ubuntu|dash|
|Alpine|ash|
|macOS|bash 호환 sh|
|CI/Docker|dash/ash|
👉 그래서 `/bin/sh`로 실행되는 스크립트는
**반드시 POSIX 문법만 써야 안전**
---
## 7. POSIX의 핵심 철학
### 7.1 최소 공통 분모
- 편리함 ❌
- 이식성 ✅
- 안정성 ✅
### 7.2 예측 가능성
- 같은 입력 → 같은 결과
- 환경 차이로 인한 사고 최소화
---
## 8. 언제 POSIX를 써야 하는가
### 반드시 POSIX가 필요한 경우
- CI/CD 스크립트
- Docker ENTRYPOINT / RUN
- 서버 초기화 스크립트
- 팀 공용 자동화
- 연구 재현성 파이프라인
### POSIX가 권장되는 경우
- 배포 스크립트
- 클라우드 인프라 자동화
- EMR/의료 시스템 운영 스크립트
---
## 9. POSIX를 선택하는 방법
### POSIX를 쓰겠다는 선언
```sh
#!/bin/sh
```
### Bash를 쓰겠다는 선언
```sh
#!/bin/bash
```
또는
```sh
#!/usr/bin/env bash
```
👉 **shebang이 곧 “언어 선택”**
---
## 10. POSIX 스크립트 작성 기본 원칙
1. `[[ ... ]]` 대신 `[ ... ]`
2. 배열 사용하지 않기
3. brace expansion 사용하지 않기
4. `source` 대신 `.`
5. `echo -e` 피하기
6. 항상 변수는 따옴표로 감싸기
```sh
"$VAR"
```
---
## 11. 한 문장 요약
> **POSIX는 “어디서 실행해도 깨지지 않는 최소한의 약속”이다.**
- POSIX = 표준
- `/bin/sh` = POSIX shell
- Bash = POSIX + 편의 기능
- 이식성과 안정성이 중요하면 POSIX