많은 리눅스 사용자들은 pushd와 popd라는 명령어를 들어본 적이 없을 수도 있지만, 이 명령어들은 아주 오랫동안 존재해 왔습니다. 이러한 명령어들은 디렉토리 탐색 과정을 매우 효율적으로 만들어 줍니다. 지금부터 이 명령어들을 어떻게 활용하는지 알아보겠습니다.
pushd와 popd란 무엇인가?
1978년 빌 조이가 C 쉘에 도입한 혁신적인 기능 중 하나는 디렉토리 스택이라는 개념과 그 스택을 조작하는 명령어인 pushd와 popd였습니다. 이러한 기능은 다른 쉘(예: Bash) 및 운영체제에도 곧바로 적용되었습니다.
스택은 간단한 개념입니다. 항목들은 하나씩 스택에 추가되고, 가장 최근에 추가된 항목은 항상 맨 위에 위치합니다. 항목을 스택에서 꺼낼 때는 맨 위에서부터 순서대로 제거됩니다. 이러한 종류의 스택은 일반적으로 후입선출(LIFO) 대기열이라고 불립니다.
pushd와 popd는 실제로는 이보다 조금 더 유연하지만, 지금은 이 모델을 이해하는 것이 좋습니다.
디렉토리 스택을 다룰 때, pushd와 popd의 “d”가 “디렉토리(directory)”를 의미한다는 것은 당연합니다. 이 명령어들을 사용하면 디렉토리를 스택에 넣거나 스택에서 제거할 수 있습니다.
그렇다면 이러한 기능이 우리에게 어떤 이점을 제공할까요?
pushd 명령어: 스택 채우기
pushd 명령어를 사용하면 다음과 같은 세 가지 작업이 동시에 수행됩니다.
- 디렉토리를 변경합니다 (cd 명령어와 동일한 방식으로).
- 현재 디렉토리의 이름과 경로를 스택에 추가합니다.
- 스택에 저장된 디렉토리 목록을 공백으로 구분하여 표시합니다.
아래 예시를 통해 새로운 pushd 명령어를 사용할 때마다 디렉토리 스택이 어떻게 확장되는지 확인해 보겠습니다. 스택의 최상위 항목은 왼쪽에 위치하며, 새로운 항목은 왼쪽부터 추가됩니다.
첫 번째 pushd 명령어 실행 후 스택에는 두 개의 항목이 추가됩니다. 즉, 떠나온 디렉토리와 이동한 디렉토리입니다.
다음과 같이 명령어를 입력합니다:
pushd ~/Desktop
pushd ~/Music
pushd ~/Documents
pushd ~/Pictures
pushd ~
마지막 pushd 명령어는 사용자를 홈 디렉토리로 이동시켰으므로, 스택의 첫 번째 항목과 마지막 항목은 모두 홈 디렉토리를 나타내는 물결표(~)입니다. 이것은 이미 스택에 있는 디렉토리가 다른 pushd 명령어에 의해 다시 추가될 수 있음을 보여줍니다.
또한, 스택의 맨 왼쪽 항목, 즉 가장 최근에 추가된 항목이 현재 디렉토리가 됩니다.
dirs 명령어
dirs 명령어를 사용하여 디렉토리 스택을 확인할 수 있습니다. 이 명령어는 스택에 영향을 주지 않고 단순히 스택의 내용을 표시해 줍니다.
dirs
pushd와 함께 사용할 수 있는 몇 가지 옵션은 스택 내 디렉토리 위치를 참조하는 데 도움이 됩니다.
각 디렉토리의 숫자 위치를 확인하려면 -v(수직) 옵션을 사용하면 됩니다.
dirs -v
물결표(~) 대신 홈 디렉토리의 실제 경로를 표시하려면 -l(긴 형식) 옵션을 추가합니다.
dirs -v -l
스택에 디렉토리 추가
앞서 보았듯이, pushd 명령어는 디렉토리 변경, 스택에 새로운 디렉토리 추가, 스택 표시의 세 가지 작업을 수행합니다. -n(회전 없음) 옵션을 사용하면 현재 디렉토리를 변경하지 않고도 스택에 디렉토리를 추가할 수 있습니다.
다음은 현재 디렉토리 스택의 상태입니다.
dirs -v -l
이제 pushd 명령어에 -n 옵션을 사용하고, /home/dave 디렉토리를 인자로 전달합니다. 그런 다음 디렉토리 스택을 다시 확인합니다.
다음 명령어를 입력합니다:
pushd -n /home/dave
dirs -v -l
/home/dave 디렉토리가 스택의 두 번째 위치(슬롯 1)에 추가되었습니다. 슬롯 0은 항상 현재 디렉토리를 나타내므로 최상위 위치를 차지할 수 없습니다.
현재 디렉토리인 ~/Videos에서 이동하지 않았기 때문에 스택의 다른 위치로 회전하지 않았습니다.
스택 회전을 통한 디렉토리 변경
pushd 명령어와 함께 숫자 인자를 사용하여 스택의 원하는 디렉토리로 이동할 수 있으며, 이때 스택이 회전됩니다. 즉, 선택한 디렉토리가 스택의 최상위 항목이 됩니다.
위치 번호를 사용하여 스택 내 디렉토리를 참조할 수 있습니다. 스택의 맨 위 또는 맨 아래에서부터 셀 수 있습니다. +3과 같은 양수는 스택의 맨 위에서부터 계산하며, -2와 같은 음수는 스택의 맨 아래에서부터 계산합니다.
/home/dave/Documents 디렉토리는 위치 3에 있습니다. 다음 명령어를 사용하여 해당 디렉토리로 이동할 수 있습니다:
pushd +3
선택한 디렉토리 위에 있던 스택의 디렉토리들은 스택의 맨 아래로 이동됩니다. 선택한 디렉토리가 이제 최상위 위치를 차지하고 해당 디렉토리로 이동하게 됩니다.
스택의 맨 아래에 있는 디렉토리로 변경하려면 다음 명령어를 사용할 수 있습니다:
pushd -0
가장 마지막 디렉토리가 첫 번째 슬롯으로 이동하고, 다른 모든 디렉토리는 스택에서 아래로 이동합니다. 이 예시에서는 ~/Pictures 디렉토리로 변경되었습니다.
popd 명령어
popd 명령어를 사용하여 스택에서 디렉토리를 제거할 수 있습니다.
디렉토리 스택을 살펴보면, 위치 1에 있는 디렉토리가 /home/dave임을 알 수 있습니다. 스택에서 이 디렉토리를 제거하려면 다음 명령어를 입력합니다:
dirs -v -l
popd +1
/home/dave 디렉토리가 제거되었고, 스택에서 해당 디렉토리 아래에 있던 디렉토리들이 각각 한 위치씩 위로 이동했습니다.
pushd 명령어와 마찬가지로 popd 명령어를 사용할 때도 스택의 맨 아래부터 셀 수 있습니다. 스택에서 마지막 디렉토리를 제거하려면 다음 명령어를 입력합니다:
popd -0
~/Music 디렉토리가 스택의 마지막 위치에서 제거되었습니다.
디렉토리를 변경하고, 특정 작업을 수행한 다음, 이전 디렉토리로 돌아가야 할 때 pushd와 popd 명령어를 함께 사용할 수 있습니다.
pushd 명령어를 사용하여 다른 디렉토리로 이동한 다음, popd 명령어를 사용하여 스택의 최상위 디렉토리를 제거하고 스택의 두 번째 위치에 있는 디렉토리로 이동합니다. 이것은 방금 이동했던 디렉토리이므로, 원래 있던 디렉토리로 다시 돌아가는 효과를 얻을 수 있습니다.
다음과 같이 입력합니다:
pushd ~
popd
~/Projects 디렉토리에서 시작하여 홈 디렉토리로 pushd한 다음, ~/Projects 디렉토리로 다시 popd 했습니다.
스택 전체 회전
몇 개의 중첩된 디렉토리가 있는 스택을 회전하는 방법을 설명할 것이지만, 파일 시스템의 어떤 디렉토리든 사용할 수 있습니다.
가장 깊은 중첩 수준은 다음과 같습니다:
/home/dave/Projects/htg/articles
홈 디렉토리에서부터 시작하여 기사 디렉토리에 도달할 때까지 각 디렉토리를 따라 단계적으로 이동합니다. 그런 다음 디렉토리 스택을 살펴보겠습니다.
다음 명령어를 입력합니다:
pushd ~/Projects
pushd htg
pushd articles
dirs -v -l
pushd +1 명령어를 반복적으로 실행하면 디렉토리 스택을 순환할 수 있습니다. 이 작업을 자주 수행한다면 pushd +1을 별칭으로 설정하는 것이 좋습니다.
다음 명령어를 입력합니다:
pushd +1
스택 최상위 디렉토리 덮어쓰기
이전처럼 cd 명령어를 사용하여 디렉토리를 변경하는 것도 가능합니다. 하지만 그렇게 하면 스택의 첫 번째 디렉토리가 덮어쓰여집니다. 이는 첫 번째 슬롯이 항상 현재 작업 디렉토리용으로 예약되어 있기 때문에 피할 수 없는 현상입니다. 스택의 다른 슬롯들은 변경되지 않습니다.
다음과 같이 입력하여 확인해 볼 수 있습니다:
dirs -v -l
cd ~/Music
dirs -v -l
pushd 및 popd 명령어에 익숙해지면(그리고 이를 사용하여 몇 가지 별칭을 설정할 수도 있음) 디렉토리 간을 매우 빠르게 이동할 수 있습니다.
이것이 바로 우리가 명령줄을 고수하는 이유입니다. 효율적이지 않나요?