Bash
Bash는 명령 해석기이자 스크립트 언어다. 터미널 앱과는 다르다. 터미널은 입출력 화면을 제공하고, Bash는 그 안에서 명령을 해석한다. 같은 터미널에서도 Zsh나 다른 셸을 실행할 수 있다.
어떤 셸이 스크립트를 읽는가
#!/usr/bin/env bash
printf 'Bash version: %s\n' "$BASH_VERSION"
이 파일을 example.sh로 저장하면 bash example.sh로 실행할 수 있다. 실행 권한을 부여해 ./example.sh로 실행할 때는 shebang이 인터프리터를 선택한다. sh example.sh로 실행하면 Bash 전용 문법을 사용할 수 있다고 보장할 수 없다.
PATH에 있는 Bash가 선택되는 예제이므로 배포 환경에서는 버전도 확인한다. bash --version은 설치된 실행 파일의 버전을 보여 준다.
파이프라인의 실패를 확인하기
다음 예제에서 첫 명령은 실패하지만 마지막 cat은 성공한다.
bash -c 'false | cat; printf "status=%s\n" "$?"'
bash -o pipefail -c 'false | cat; printf "status=%s\n" "$?"'
출력은 각각 status=0, status=1이다. pipefail은 파이프라인의 종료 코드 계산을 바꾼다. 그 자체로 스크립트를 중단하지는 않는다. 실패 후 실행하면 안 되는 단계는 조건문으로 제어한다.
set -o pipefail
if ! producer | consumer; then
printf 'pipeline failed\n' >&2
exit 1
fi
여기서 producer와 consumer는 실제 명령으로 바꿔야 하는 자리표시자다. 입력을 읽지 못했는데 빈 결과물을 정상 파일로 게시하는 문제를 막는 데 이런 구분이 중요하다. set -e도 문맥에 따른 예외가 있어 명시적인 실패 처리를 완전히 대신하지 않는다.
설정 파일을 수정했는데 적용되지 않는 문제는 로그인 셸과 시작 파일에서 이어서 다룬다.
자료: Bash 파이프라인, Bash set 옵션