**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