command 묶는 두 방법
{ cmd1; cmd2; }— 현재 shell 에서 실행. 변수가 그룹 후에도 유지.(cmd1; cmd2)— 서브셸 에서 실행. 변수 변경 밖으로 안 셈. 약간 느림 (fork).
{} 를 쓸 때
여러 command 에 단일 redirection 적용:
{
echo "=== build log ==="
date
./build.sh
} > build.log 2>&1블록 전체가 build.log 로. >> 세 번 절약.
() 를 쓸 때
side effect 격리. 흔한 패턴 — 디렉터리 들어가 작업 후 자동 복귀:
(
cd ~/projects/temp
./make.sh
)
# 원래 디렉터리에 그대로괄호 안의 변수, cd, set 옵션이 부모 shell 에 영향 없음.
$() 안의 캡처
$(cmd) 도 subshell. 그래서 x=10; $(x=20) 가 x 안 바꿈 — 할당이 fork 안에 살았음.
{} 문법 주의
- 중괄호 안에 공백 필요.
- 닫는 중괄호 앞에 세미콜론 (또는 줄바꿈) 필요.
{cmd} 는 안 됨, { cmd; } 는 됨. shell 파서가 여기 까다로워.