파일처리_03 디렉터리 이동한 다음 간단히 원래 장소로 돌아가기(cd)

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: cd, echo, tar
키워드: 서브셸, 현재 디렉터리, 자식 프로세스
사용처: 스크립트 안에서 cd 명령어로 다른 디렉터리로 이동하고 나서 원래 디렉터리로 간단히 돌아가고 싶을 때 사용합니다.

실행 예제

$ ./subcd.sh
Archive: /var/tmp/archive.tar
count.txt
data1.txt
data2.txt
Start: command.sh

스크립트

#!/bin/sh
 
# 괄호 안은 서브셸이 되므로 디렉터리 이동은 이 안에서만 유효
(
    echo "Archive: /var/tmp/archive.tar"   # ------ 1
    cd /var/tmp                            # ------ 1
    tar cvf archive.tar *.txt              # ------ 1
)
 
# 스크립트 실행은 현재 디렉터리에서 처리
echo "Start: command.sh"
./command.sh

   

해설

이 스크립트는 /var/tmp로 현재 디렉터리를 이동해서 그 안에 있는 확장자 txt 파일을 archive.tar로 압축한 다음, 원래디렉터리로 돌아와서 command.sh를 실행합니다. 여기서 command.sh는 예제 스크립트와 같은 디렉터리에 있는 스크립트라고 가정합니다.

셸 스크립트는 cd 명령어로 작업용 디렉터리로 이동하기도 합니다. 처리가 끝나서 원래 디렉터리로 돌아가려면 처음에 자신이 있던 디렉터리명을 저장해둬야 합니다. 하지만 원래 있던 곳을 저장해두지않아도 간단한 방법으로 원래 디렉터리로 돌아갈 수 있습니다.

1은 서브셸 표기로 괄호로 둘러싼 부분이 서브셸로 실행됩니다. 서브셸은 현재 셸 안에서 새롭게 실행되는 셸을 말합니다. 서브셸을 부른 곳의 환경 설정은 서브셸에 이어지지만 서브셸 내부에서 일어나는 변경은 호출한 원래 셸에는 영향을 주지 않습니다. 따라서 서브셸에서 현재 디렉터리를 변경하거나 변수값을 변경해도 원래 셸의 현재 디렉터리나 변수값은 변하지 않습니다. 이런 관계를 유닉스는 ‘부모와 자식’이라고 부릅니다. 즉 서브셸은 자식 프로세스가 되고, 호출한 곳은 부모 프로세스가 됩니다.

이 예제에서는 서브셸의 ‘호출한 곳의 환경이 변하지 않는 성질’을 이용합니다. 서브셸 안에서는 cd 명령어로 현재 스크립트가 설ㄹ치된 디렉터리에서 /var/tmp로 디렉터리 이동을 하더라도 서브셸에서 빠져나오면 원래 현재 디렉터리로 자동으로 돌아옵니다(cd 명령어로 원래 디렉터리로 돌아가지 않아도 됩니다). 따라서 ‘cd 명령어로 원래 디렉터리로 돌아가는 걸 잊었을 때 종종 발생하는 단순한 버그’를 방지할 수 있습니다.

   

주의사항

  • 서브셸 안에서 변수값을 변경해도 원래 셸에는 반영되지 않습니다. 서브셸에서 변수값을 변경했다고 착각하는 것도 자주 있는 실수입니다.