수년간 cd 명령을 사용한 경험이 있더라도, cd 명령의 몇 가지 기능에는 아마 놀랄지도 모르겠다. 아무튼, 언제 man cd를 마지막으로
실행해보았는가? (cd 명령에 대한 문서로 연결되는 링크는 참고자료를 참조한다.)
cd 명령에는 불필요한 입력을 상당히 많이 줄여줄 수 있는 몇 가지 트릭이 있다. 디렉토리를 얼마나 자주 변경해야 하는지 생각해보면 좋은 소식임에 틀림없을
것이다.
본 기사에서는 UNIX® 디렉토리 구조를 살펴보고 현재 디렉토리 경로를 보고 쉘 프롬프트에 디렉토리를 추가할 수 있는 방법을 설명한다. 몇 가지 간단한 cd 예제를 살펴본 후, 절대 경로와 상대 경로의 의미와 각각의 경로를 사용하는 시기를 설명하겠다. 그런 다음, 홈 디렉토리로 이동하는 방법, 다른 사용자의 홈 디렉토리를 식별하는 방법 등과 같이, 시간 절약 효과가 뛰어나 필자가 자주 사용하는 cd 단축키 몇 가지를 알려주도록 하겠다. 두 디렉토리 사이에서 앞뒤로 전환하는 방법을 설명하고 필자가 곧잘 cd 셔플이라고 부르는, cd에 대해 잘 알려져 있지 않은 주옥과도 같은 기능도 알려주겠다. 그것은 유사한 두 디렉토리 경로 간을 이동하는 간단한 방법이다.
하지만, 디렉토리 변경을 살펴보기 전에 UNIX 디렉토리 구조에 대한 개요를 이해하는 것이 중요하다.
Windows® 운영 체제에서 폴더라고 알고 있는 것을 UNIX에서는 디렉토리라고 부른다. 디렉토리는 파일과 다른 디렉토리의 그룹을 보유한 컨테이너이다.
슬래시(/)로 표시되는 루트 디렉토리에서 아래쪽으로 UNIX 분기에 있는 모든 디렉토리. 예:
- /usr 디렉토리는 루트 디렉토리(
/)의 서브디렉토리이다. - /usr/spool 디렉토리는 /usr의 서브디렉토리이다.
- /usr/spool/mail 디렉토리는 /usr/spool의 서브디렉토리이다.
. . . 기타 등등.
목록 1에 나타낸 것처럼, 쉘 프롬프트에서 pwd 명령을 실행하면 자신이 있는 디렉토리의 경로 이름을
표시할 수 있다. 이 명령은 현재 작업 디렉토리(present working directory)를 의미한다.
목록 1. 현재 작업 디렉토리(pwd) 표시
# pwd # /home/anthony |
다른 디렉토리로 변경하려면 cd 뒤에 공백을 하나 넣은 다음 이동할 디렉토리를 입력한다. UNIX 명령은 대소문자를 구분하므로, 디렉토리 이름에 실제로
대문자가 있지 않은 경우에는 모두 소문자로 사용한다. 목록 2의 예제에서, 필자는 루트 디렉토리에서 끝까지 디렉토리들의 흔적을 추적하는
절대 경로를 사용하고 있으므로 필자가 변경하는 각 디렉토리는 슬래시(/)로 시작한다.
목록 2. 절대 경로를 사용하는 cd 명령
# cd /var # cd /usr/spool/mail # cd /home/anthony |
권한이 있는 경우(실행 권한이 필요함) 절대 경로 이름을 사용하여 어떤 디렉토리에든 이를 수 있다. 목록 2의 명령은 예제로 제공되는 것이다. 작업 디렉토리 변경 지점은 즉시 다른 곳으로 이동하지 않고 그 안에서 어떤 작업을 수행하기 때문에, 보통 cd 명령 두 개를 연속으로 실행하지는 않는다.
입력한 디렉토리가 유효한 디렉토리가 아니거나 그 디렉토리로 이동할 권한이 없는 경우, cd 명령을 실행하면 오류가 표시된다. cd 명령에 실패하는 경우에는 시작한 디렉토리에 그대로 머문다.
cd 명령을 실행했는데 아무런 오류도 표시되지 않았으므로, 명령이 올바로 작동한 것으로 가정한다. 그러나 현재 어떤 디렉토리에 있는지 확실히 아는 것이 좋을 것이다.
물론, 현재 작업 디렉토리를 확인할 필요가 있을 때마다 pwd 명령을 실행할 수 있지만, 더 나은 방법이 있다. cd 명령 실행에
성공할 때마다, 새 작업 디렉토리는 환경 변수 $PWD(Present Working Directory)에 저장된다.
이 변수는 pwd 명령과 달리 대문자로 되어 있다. 그래서 목록 3에서 볼 수 있듯이, echo를
사용하여 $PWD의 값을 표시할 수 있다.
목록 3. $PWD 표시
# echo $PWD # /home/anthony |
앞서 본 pwd 명령을 실행하는 것보다 훨씬 더 쉽게 보이지는 않는다. 그렇지 않은가? 아직도 자신의 디렉토리가 어떤 변수에
저장된다는 사실을 아는 것이 도움이 된다. 그 이유는 쉘 프롬프트의 일부로 $PWD의 값을 표시할 수 있기 때문이다.
지금까지 사용된 예제에서, 쉘 프롬프트는 해시 또는 파운드 기호(#)로 설정된다. 그러나 쉘 프롬프트에 $PWD를 포함하면,
현재 어떤 디렉토리에 있는지 알 수 있다. 그러면 cd를 실행할 때 PWD 변수가 업데이트되고 쉘 프롬프트의 일부로 표시된다.
목록 4에 표시된 행을 추가하여 홈 디렉토리의 .profile에서 쉘 프롬프트 변수 PS1을 설정할 수 있다.
목록 4. 쉘 프롬프트에 $PWD 포함
PS1='${PWD} > '
export PS1
|
다음에 로그인할 때, .profile은 로그인 프로세스의 일부로 실행해야 하고 이를 실행하면 쉘 프롬프트의 일부로 작업 디렉토리가 표시된다. 홈 디렉토리에 이르는 방법을 알고 있다면 .profile을 바로 실행할 수 있다(목록 5 참조).
목록 5. 새 쉘 프롬프트로 새 .profile 실행
# . ./.profile /home/anthony > |
호스트 이름, 로그인 이름 또는 몇몇 다른 표시 문자를 포함하도록 프롬프트를 사용자 정의할 수 있다. 쉘 프롬프트의 기능 향상에 대한 자세한 내용은 참고자료의 "팁: 프롬프트 매직" 기사를 참조한다.
트리의 한 분기에서 근처의 다른 분기로 점프만 하려고 할 때는 절대 경로를 사용하는 것이 좀 귀찮은 일이다. 그것이 바로 cd 명령에서 상대 경로의 사용을 허용하는 이유이다. 기본적으로, 상대 경로는 사용자가 현재 있는 디렉토리에 대한 상대적인 디렉토리를 가리킨다. 상대 경로를 사용한다는 것은 비록 시작 디렉토리와 대상 디렉토리에 달린 것이겠지만, 종종 키 입력 횟수가 줄어든다는 뜻이다.
예를 들어, /home/anthony에서 /home/anthony/bin으로 이동하려면 대상 디렉토리(/home/anthony/bin)의 절대 경로를 입력할 필요가 없고, 목록 6에서 보듯이 현재 자신이 위치한 디렉토리에 상대적인 새 경로를 입력하는 것으로 충분하다.
목록 6. 상대 경로를 이용한 cd 명령
/home/anthony > cd bin /home/anthony/bin > |
쉘 프롬프트에서 $PWD의 새 값을 어떻게 표시하는지 잘 살펴보자.
-a 플래그를 사용하여 ls 명령을 실행하면 .(점)에 대한 항목과
..(점-점)에 대한 다른 항목을 볼 수 있다. 한 개의 점은 현재 디렉토리를 나타낸다. 두 개의 점은 상위 디렉토리, 즉 현재 있는
디렉토리 바로 위의 디렉토리를 나타낸다.
cd를 통해 한 레벨 위로 이동할 때 상위 디렉토리를 사용하면 편리하다. 목록 7에서 그 방법을 보여준다.
목록 7. cd 명령을 사용하여 상위 디렉토리(..)로 이동
/var/spool/mqueue > cd .. /var/spool > |
그러면 새 서브디렉토리로 이동할 수 있다(목록 8 참조).
목록 8. cd를 사용하여 서브디렉토리로 이동
/var/spool > cd mail /var/spool/mail > |
또는 목록 9에서 보듯이 단 하나의 명령으로 그 모든 작업을 수행할 수도 있다.
목록 9. 하나의 명령으로 한 분기에서 다른 분기로 이동
/var/spool/mqueue > cd ../mail /var/spool/mail > |
목록 10에 표시된 것처럼, 상위 레벨로 두 단계 점프한 다음 하위 레벨로 두 단계 점프할 수도 있다.
목록 10. 분기를 관통하여 점프
/usr/IBM/WebSphere/AppServer/profiles > cd ../../PortalServer/log /usr/IBM/WebSphere/PortalServer/log > |
상대 경로를 사용하는 데 익숙해지면 매우 자연스럽게 사용할 수 있을 것이다.
UNIX 사용자를 생성할 때 어떤 사용자에게든 홈 디렉토리가 정의된다. /etc/passwd에서 홈 디렉토리를 찾거나 smit를 사용할 수도
있겠지만, 홈으로 이동하는 더 좋은 방법이 있다.
홈 디렉토리로 이동하려면 목록 11에 표시된 것처럼 매개변수 없이 cd 명령을 사용한다.
목록 11. cd로 빠르게 홈 추적
/usr/IBM/WebSphere/PortalServer/log > cd /home/anthony > |
홈 디렉토리는 $HOME 변수에 저장된다. 이는 매개변수가 없는 cd 명령은 cd $HOME을 입력하는 것과 동일하다는
뜻이다(목록 12 참조).
목록 12. cd $HOME
/var/spool/mail > cd $HOME /home/anthony > |
지금 당장은 홈 디렉토리로 이동하지 않더라도 그 $HOME 변수는 자신의 홈 디렉토리를 아는 데 유용하다. 사실, $HOME 변수는 별명(물결표(~)로
표시)을 가지므로 매우 유용할 수 있다.
홈 디렉토리에 있는 파일을 보거나 그 파일에 대한 작업을 하고 싶을 수도 있다. 다른 디렉토리에 있는 경우, 우선 홈으로 이동하거나 전체 디렉토리 경로를 입력할 필요가 없다. 그냥 물결표 문자만 사용하면 된다. 목록 13은 필자의 홈 디렉토리에 있는 .profile의 사본을 만드는 것을 나타낸 것이며, 이는 모두 편의상 그렇게 한 것이다.
목록 13. $HOME에 대한 물결표 단축키
/usr/IBM/WebSphere > cp ~/.profile ~/.profile.save |
(사용 권한에 따라 허용되는 경우) 물결표를 사용하여 다른 사용자의 홈 디렉토리에 있는 파일을 사용하거나 나열할 수도 있다. 이렇게 하려면 목록 14에 나타낸 것처럼 그냥 물결표 다음에 사용자의 로그인 이름을 입력하면 된다.
목록 14. 물결표는 모든 사용자의 HOME
/home/anthony > cp ~john/.profile ~john/.profile.save |
이것이 사용자의 홈 디렉토리를 추측하기보다 더 안전하고 /etc/passwd에서 이를 찾기보다 더 쉽다.
하나 또는 두 개의 명령만 실행한 다음 이전에 있었던 디렉토리($OLDPWD)로 돌아올 필요가 있을 때가 종종 발생한다. 그렇게 하려면 cd 대시백을
사용한다. cd 대시백은 cd 뒤에 대시를 입력하는 것이다(cd -). 목록 15에서 cd를 실행할 때마다 $PS1 쉘
프롬프트에서 새 디렉토리를 어떻게 표시하는지 눈여겨보자.
목록 15. 이전 디렉토리로 리턴
/home/anthony > cd /usr/sys/inst.images /usr/sys/inst.images > cd - /home/anthony > |
이 cd 대시백의 실행 결과, 이것을 두 번 입력하면 두 디렉토리 사이에서 앞뒤로 전환할 수 있다. 한 디렉토리에서 프로그램이나 구성 파일을 변경하고 다른 디렉토리의 로그 파일에서 변경 결과를 보려고 할 때 이 기능이 유용할 수 있다. 목록 16은 두 디렉토리 사이의 전환을 나타낸 것이다. 다른 예제와 마찬가지로, 디렉토리를 실제로 변경한 직후 실행할 수 있는 명령은 건너뛰겠다.
목록 16. $PWD와 $OLDPWD 사이의 전환
/data/log > cd /apps/config /apps/config > cd - /data/log > cd - /apps/config > |
필자가 특히 큰 도움이 된다고 생각하는 기능이 바로 cd 셔플이다. cd 셔플은 두 디렉토리 경로의 차이점이 하나뿐일 때(예: 단 한 단어 차이) 이전 디렉토리에서 새 디렉토리로 간단하게 전환할 수 있는 방법이다.
UNIX를 능숙하게 다룰 줄 아는 사용자라도 이 기능을 한 번도 사용해본 적이 없다면 구문이 좀 이상하게 보일 수도 있겠지만, 어쨌든 효과 만점이다. 목록 17을 살펴보자.
목록 17. cd 셔플 구문
cd directorya directoryb |
첫 번째 매개변수는 현재 디렉토리 경로에서 바꾸고 싶은 문자열이다.
두 번째 매개변수는 대체 문자열이다. 예를 들어, v7에서 v8로 이동하려면 목록 18에 표시된 것처럼 cd v7 v8이라고만
입력하면 된다.
목록 18. cd 셔플 사용
/programs/v7/reports/monthly > cd v7 v8 /programs/v8/reports/monthly > |
이 단 하나의 명령으로 19번의 키 입력이 줄어들었다! 이 명령을 사용하는 것이 세 개의 상위 디렉토리를 거슬러 올라간 다음 다시 해당 디렉토리 트리로 이동하거나 절대 경로를 사용하는 것보다 훨씬 간단하다.
두 개의 매개변수를 사용하는 이 cd 명령의 용도는 무척 다양하다. 예컨대, 데이터베이스 인스턴스 이름, 분기 이름 또는 날짜만 다른 비슷한 디렉토리 경로 간을 전환할 때 이 명령을 사용하면 편리하다. cd 셔플을 사용하면 매우 짧은 시간 내에 수천 번의 키 입력을 줄일 수 있다.
히스토리의 각 연도와 월에 대한 디렉토리가 있는 경우, cd 셔플을 사용하면 한 연도에서 다른 연도로 점프할 수 있다. 목록 19에서 그 방법을 확인할 수 있다.
목록 19. 새 연도
/hist/2010/april/reports > cd 2010 2011 /hist/2011/april/reports > |
같은 연도 내에서 다른 달로 변경하려면 목록 20에 나타낸 것처럼 from 월과 to 월을 매개변수로 하는 cd 셔플을 사용하면 된다.
목록 20. 월 디렉토리 스왑
/hist/2011/april/reports > cd april may /hist/2011/may/reports > |
두 디렉토리 경로에서 문자열 하나만 다른 경우에 cd 셔플이 이상적이다.
필자는 스크립트에서 cd를 사용할 때 다음 명령으로 계속 진행하기 전에 항상 변경 디렉토리가 올바로 작동했는지 확인한다. 필자는 2년 동안 매일 잘 작동했던 두 행으로 구성된 정리 스크립트로 인해 운영 체제가 다운되는 문제를 한 차례 겪은 적이 있다. 원격 호스트가 꺼졌을 때 NFS가 마운트된 디렉토리가 사용 불가능해졌다. cd 명령에 실패했지만, 시스템에 정리할 것이 아무 것도 남아 있지 않을 때까지는 어쨌든 정리 스크립트가 계속 실행되었다.
다른 작업을 진행하기 전에 cd가 올바로 작동했는지 간단히 확인하는 한 가지 방법은 cd 명령 바로 뒤에 쉘 단락(shell short-circuit) &&를
사용하는 것이다. cd 명령이 실패하면 다음 명령이 계속 실행되지 않는다.
목록 21을 보자.
목록 21. cd 및 단락
cd /some/dir && rm *.log |
이 기사에서는 cd 명령에 대해 배워보았다. 절대 경로와 상대 경로를 사용하여 디렉토리를 변경하는 방법을 살펴보았고, 현재 자신이 위치한 작업 디렉토리를 표시하고 두 디렉토리 사이에서 앞뒤로 전환하는 방법을 학습했다. 홈 디렉토리를 참조하는 몇 가지 다른 방법을 살펴보았고, 현재 경로의 문자열을 대체하고 새 경로로 전환할 수 있게 해주는 cd 셔플이라는 잘 알려져 있지 않은 기능에 대해서도 배웠다.
cd 명령은 명령행에서 매우 중요하고 자주 사용되므로, 수많은 단축 기능 중 유용한 몇 가지는 꼭 알아두면 좋다.
교육
-
command
reference for the cd command를 읽어보자.
-
AIX
file systems and directories에 대한 개론을 소개한다.
-
팁: 프롬프트 매직(Daniel Robbins, developerWorks, 2000년 9월)을 참조하여
쉘 프롬프트를 사용자 정의할 수 있다.
-
AIX와 UNIX developerWorks 영역: AIX와 UNIX 영역에서는 AIX 시스템 관리와 UNIX 스킬 확장의 모든 측면과 관련된 풍부한 정보를 제공한다.
-
AIX와 UNIX 입문
AIX와 UNIX 입문 페이지에서 자세한 정보를 볼 수 있다.
-
기술 서점: 다양한 기술 주제와 관련된 서적을 살펴볼 수 있다.
토론
-
developerWorks에서 AIX Down Under라는 Anthony의 블로그를
확인해보자.
-
Anthony on Twitter를 팔로우하여 Anthony의 블로그 업데이트 내용을 수시로 확인해보자.
- Twitter의 developerWorks 페이지를 살펴보자.
- My developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX® 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- Performance Tools Forum
- PowerVM Forum
- 기타 AIX and UNIX Forums

Anthony English is an independent contractor from Sydney, Australia. He has worked on AIX systems since 1991 and writes the IBM developerWorks blog, AIX Down Under. You can reach Anthony at anthonyenglish@levitar.com.au.