C.W.K.
Stream
Lesson 04 of 05 · published

서브셸과 command grouping

~8 min · subshell, grouping, scope

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

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 파서가 여기 까다로워.

Code

그룹 + redirect·bash
{
  echo '== status =='
  date
  uname -a
  df -h /
} > /tmp/snapshot.txt 2>&1
cat /tmp/snapshot.txt
서브셸 자동 복귀·bash
pwd
(
  cd /tmp
  pwd          # /tmp
)
pwd            # back to original

External links

Exercise

(cd /tmp; pwd); pwd 실행 — 원래 디렉터리에 그대로 있는 거 확인. 이어서 { echo a; echo b; } > /tmp/two.txt; cat /tmp/two.txt. 차이 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.