푸시 및 팝 명령은 어떻게 사용합니까?


332

무엇 모두의 실제 용도는 pushdpopd시기를이 두 명령을 사용하는 이점이있다 cd하고는 cd -?

편집 : 나는이 명령 모두에 대한 실제 사용 예를 찾고 있거나 디렉토리와 스택을 유지하는 이유 (탭 완성, cd -단축 별칭 cd ..등이있는 경우)를 찾고 있습니다 .

답변:


304

pushd, popd디렉토리 스택dirs 을 조작 할 수있는 쉘 내장입니다 . 디렉토리를 변경하는 데 사용할 수 있지만 사용자가 온 디렉토리로 돌아갈 수 있습니다.

예를 들어

다음 디렉토리로 시작하십시오.

$ ls
dir1  dir2  dir3

dir1로 푸시

$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir

dirs명령은 스택에 2 개의 디렉토리가 있음을 확인합니다. dir1그리고 원래의 디렉토리, somedir.

../dir3으로 푸시되었습니다 ( dir1지금 내부에 있기 때문에 )

$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3

dirs스택에 3 개의 디렉토리가 있음을 보여줍니다. dir3, dir1somedir. 방향을 확인하십시오. 모든 새 디렉토리가 왼쪽에 추가됩니다. 디렉토리가 튀어 나오면 왼쪽에서 나옵니다.

디렉토리를 수동으로 변경 ../dir2

$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir

이제 디렉토리 터지기 시작

$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1

우리는 다시 튀어 나왔습니다 dir1.

다시 팝업 ...

$ popd
~/somedir    
$ pwd
/home/saml/somedir

그리고 우리는 시작한 곳으로 돌아 왔습니다 somedir.

약간의 혼란을 얻을 수 있지만, 스택의 머리는 당신이 현재하고있는 디렉토리입니다 수 있음 따라서 우리가 돌아올 때. somedir, 비록 dirs프로그램이 :

$ dirs
~/somedir

스택이 비어 있습니다.

$ popd
bash: popd: directory stack empty

19
감사합니다. 스택 개념과이 명령의 작동 방식을 완전히 이해합니다. 그러나 디렉토리와 스택을 유지 해야하는 실용적인 이유를 찾고 있습니다 (탭 완성, cd -단축 별칭 cd ..등이있는 경우).
syntagma

21
내가 자주 사용 pushdpopd그들은 내가에서 오는 된 위치를 기억 할 필요가 저를 저장 / c를 스크립트에서, 나는 언제나 할 수 b를 popd다시 내가 온 곳에서 얻을 수 있습니다. 나는 보통 popd >/dev/null 2>&1침묵을 유지합니다. 나는 매일 쉘에서 CD를 사용한다. 이 문서의 다른 시간 절약 팁도 있습니다 thegeekstuff.com/2008/10/...은 .
slm

2
@ 개럿-내가 생각할 수있는 것은 없습니다.
slm

4
@Garrett @slm cd -은 마지막 디렉토리 만 추적하므로 디렉토리를 내부적으로 변경하는 함수를 호출하면 문제가 발생할 수 있다고 생각합니다. 이 경우 함수는 다시 팝업하려는 디렉토리가 아닌 현재 디렉토리로 재설정됩니다. 푸시 / 팝핑이 가장 안전한 방법입니다. 참고 : 나는 내 이론을 테스트하지 않았습니다.
Binary Phile

5
~/somedir/dir3첫 번째 로 돌아 가지 않겠 popd습니까?
ziyuang

198

에 정말 유용한 사용 사례 pushdpopd명령을 동시에 여러 폴더로 작업.

스택이 열거되어 있으므로 스택을 매우 쉽게 탐색 할 수 있습니다. 즉, 작업 중에 여러 작업 폴더를 사용할 수 있습니다.

아래의 간단한 예를 참조하십시오.


먼저 폴더 구조의 예를 만들어 봅시다.

    user@vb:~$ mkdir navigate
    user@vb:~/navigate$ mkdir dir1
    user@vb:~/navigate$ mkdir dir2
    user@vb:~/navigate$ mkdir dir3

그런 다음 모든 폴더를 스택에 추가 할 수 있습니다.

    user@vb:~/navigate$ pushd dir1/
    ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir1$ pushd ../dir2/
    ~/navigate/dir2 ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

다음을 통해 찾아 볼 수 있습니다.

    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir2
     2  ~/navigate/dir1
     3  ~/navigate

안전하게 탐색하려면 항상 다시 작성되므로 마지막 폴더를 두 번 추가해야합니다.

    user@vb:~/navigate/dir3$ pushd .
    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

이제 이러한 폴더를 탐색하고 폴더의 별칭과 마찬가지로 스택으로 작업 할 수 있습니다. 다음 부분은 설명이 필요합니다.

    user@vb:~/navigate/dir3$ cd ~4
    user@vb:~/navigate$ dirs -v
     0  ~/navigate
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate$ cd ~3
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate/dir1$ touch text.txt
    user@vb:~/navigate/dir1$ cp text.txt ~2
    user@vb:~/navigate/dir1$ ls ~2
    text.txt
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

추가 팁 은에 대한 별칭을 만드는 것입니다 dirs -v.

예를 들면 다음과 같습니다.

# In ~/.bashrc
alias dirs="dirs -v"

28
그리고 당신은에 의해 스택을 취소 할 수 있습니다dirs -c
준 무라카미

19
실제로 몇 가지 실용적인 예를 제공 한 +1 맨 페이지에서 push / popd가 수행하는 작업을 쉽게 확인할 수 있지만 처음에는 dirs와 cd ~ #가 명확하지 않습니다.
Scribblemacher

대신 이런 종류의 워크 플로에 fasd와 같은 솔루션을 사용할 수도 있습니다.
WuTheFWasThat

CDPATH를 설정하는 것보다 일시적인 사용 사례에 더 적합합니까?
rfabbri

2
@Jun, 한 번에 3 개의 디렉토리를 만드는 "mkdir dir {1,2,3}"이 있습니다.
Bulat M.

39

dirs stack을 사용하는 간단한 유스 케이스는 cd로 할 수없는 일입니다.

pushd .현재 디렉토리 XX를 dirs스택에 추가합니다 . 나중에을 사용하여 이동할 수 있으며 cdXX로 돌아가려면 popd디렉토리 트리에서 얼마나 멀리 떨어져 있는지에 관계없이 수행 합니다 (여러 레벨, 옆으로 건너 뛸 수 있음). bash 스크립트에서 특히 유용합니다.


2
이것이 내가 가장 자주 이용하는 기능이라고 생각합니다. pushd/ popd독립적으로 작동 하기 때문에 cd보다 안정적인 책갈피로 사용할 수 있습니다 cd -.
고든 빈

나를 위해 이것은 사실이 아닙니다. cd를 사용할 때마다 내 스택이 변경됩니다.
Harendra Singh

아, 그것은 zsh를 사용하는 coz였습니다. 내가 bash로 바꿀 때 잘 작동합니다.
Harendra Singh

4
이것은 cd-, IMO와 비교할 때 유일하게 실질적인 답변입니다. foo를 밀 었는지에 관해서; <랜덤 디렉토리 변경>; popd는 a = foo보다 더 가치가 있습니다. cd $ a; <랜덤 디렉토리 변경>; cd $ a ... 스크립트의 경우 전자 (pushd)에서 구문상의 편의가 매우 작지만 후자 (명시 적 변수)에서는 명확성이 크게 향상되었습니다. 대화 형 세션의 경우 처음에는 디렉토리 계층 구조가 올바르게 구성되어 있다고 가정하고 cd ~ / back / to / obvious / path를 잃어 버린 경우가 있다고 생각합니다.
Jan Kyu Peblik

9

pushd그리고 popd당신은 스택에 디렉토리를 조작 할 수 있습니다.

당신은 때 pushd디렉토리, 당신은 매개 변수로 지정된 하나에 스택 변경 디렉토리에 현재 디렉토리를 넣어.

popd 스택의 디렉토리로 돌아갈 수 있습니다.

반복하면 디렉토리 순회가 유지되며 저장된 디렉토리와 반대 순서로 저장된 디렉토리로 돌아갈 수 있습니다.


6

에 대한 bash는 , 기본적으로 : 대신 CD를 사용하는 사용할 수 있습니다 pushd방문 디렉토리의 역사는 저장됩니다 실제 사용과, directorys를 변경하는 (정확하게 : 스택) 한 그들 사이를 전환 할 수 있습니다

pushd /home; pushd /var; pushd log

dirs"스택 항목"의 수를 얻기 위해 스택 사용 및보다 쉬운 탐색을 보려면 다음을 사용하십시오.

dirs -v

산출:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

이제이 숫자들을 다음 cd~같이 사용하십시오 :

cd ~1

그러나이 숫자는 이제 재 배열되고 위치 "0"이 변경되므로 pushd디렉토리는 최상위 위치로 두 번 (또는 위치 0에서 더미 사용) 다음과 같습니다.

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

이제 1..3 위치를 유지합니다

(스택에서 현재 디렉토리를 릴리스 / 히스토리 사용에서 삭제 popd)


5

내가 찾은 실용적인 용도 중 하나는 pushd와 popd를 사용하여 디렉토리를 전환하는 것입니다.

dir1과 dir2라는 두 개의 디렉토리가 있고 xyz 이유로 연속적으로 전환해야한다고 가정 해보십시오.

현재 내가 두 디렉토리가 somedir에서 오전 dir1dir2:

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

이제로 전환 dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

이제 dir1스택에 추가 하고dir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

당신이 볼 수 있듯이, 지금이 dir2dir1스택에 난으로 현재입니다 dir2.

이제 다시로 전환하기 위해을 dir1실행하겠습니다 pushd || popd.

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Voila, dir1에 있고 dir1과 dir2가 스택에 있습니다. dir2로 다시 전환하려면 다음을 실행하십시오.pushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

이것은 디렉토리 간을 전환하는 간단한 방법입니다. 이제 디렉토리를 전환해야하는 이유는 무엇입니까? 하나의 유스 케이스는 웹 응용 프로그램에서 작업 할 때 하나의 디렉토리에 make 파일이 있고 다른 디렉토리에 로그 파일이 있다는 것입니다. 응용 프로그램을 디버깅 할 때 종종 로그 디렉토리 사이를 전환하여 최신 로그를 확인한 다음 make 디렉토리로 다시 전환하여 변경 사항을 적용하고 응용 프로그램을 빌드해야합니다.


11
(1) 질문은 "의 장점은 무엇입니까, 요청 pushdpopd이상은 cd -?" 정확히 무엇을 설명하는지에 따라 그 질문에 분명히 대답하지 않았습니다 cd -. (2) 무슨 요점이 pushd || popd있습니까? 예, 나는 그것이 cmdA || cmdB실행 을 의미 한다는 것을 알고 cmdA있으며 실패하면 실행 cmdB합니다. 나는이 맥락에서 그것이 무엇을 잘하는지 묻고 있습니다.  pushd인수가 없으면 "디렉토리 스택에서 최상위 두 요소를 교체합니다"를 의미합니다. 현재 디렉토리가 디렉토리 스택의 유일한 요소 인 경우 실패합니다. 이 경우 popd에도 실패합니다.
G-남자

3
아무도 당신을 혐오했다고 믿을 수 없습니다! 생명의 은인! 멋진 해킹입니다. 감사. 내 의견으로 pushd and 유스 케이스를 토글 popd합니다.
Sonny

3
pushd || popd디렉토리 간을 전환 하는 것보다 타이핑이 훨씬 덜 필요한 두 가지 방법 pushd이 있습니다. 인수없이이 방법 만 사용합니다. cd -마지막 디렉토리로 다시 전환하기 위해 명시 적으로 존재합니다. 또한이 질문은 pushdover 의 이점을 요구 cd -했지만이 답변은 분명히 더 많은 타이핑을 제공합니다.
Benjamin Riggs

bash에서 인수없이 push는 최상위 두 디렉토리를 교환하고 0을 반환합니다. 왜 || popd전환 이 필요한 가요? 설명 해주십시오. (충분히 밀지 않았습니까?)
Johnny Wong

@Sonny cd -두 디렉토리 사이를 전환 하는 데 사용하십시오 . 또한 cd인수가 없으면 홈 디렉토리로 돌아갑니다.
Steve

2

간단히 말해서 2 개 이상의 디렉토리 사이를 탐색해야 할 때, 보통 2 개 이상의 cd -폴더로 잘라 내지 않기 때문에 보통 몇 번 앞뒤로 탐색해야합니다 .

예를 들어, 버퍼의 히스토리를 보거나 긴 경로를 완료하여 이전의 긴 경로를 다시 시도하지 않고 중요한 경로를 쌓아 두는 것만으로 필요한 경우 숫자만으로 편리하게 이동할 수 있습니다. 복잡한 디렉토리 구조와 긴 경로 사이를 회전하는 것은 매끄럽고 빠릅니다.

내장 기능을 사용하면 스택 순서를 바꾸거나 더 이상 필요하지 않은 디렉토리를 튀어 나와 작업 흐름에 유연성을 부여 할 수 있습니다.

디렉토리 스태킹은 여러 디렉토리에 걸친 작업을 위해 스크립트에서 유사하게 사용될 수 있습니다.


1

dirs / popd / pushd 사용법이 약간 불편하다는 것을 알았습니다. 다음 코드를 .alias에 추가하여 tcsh에서 개인 솔루션을 생각해 냈습니다.

  foreach b (. , - 0 1 2 3 4 5 6 7 8 9 )
    alias p$b       'set a=`pwd`; echo $a >! ~/.mydir'$b
    alias cd$b      'cd "`cat ~/.mydir'$b'`"'
    alias del$b     'rm -v ~/.mydir'$b
    alias home$b    'set a="~"; echo $a >! ~/.mydir'$b
  end
    alias cdl       'grep / ~/.mydir*'

이 방법으로 예를 들어 "p"라는 별칭을 지정했습니다. 현재 작업 디렉토리를 ~ / .mydir 파일에 저장합니다. 및 "cd." 언제 어디서나 그 디렉토리를 복구합니다. "델" 해당 파일을 제거합니다. "집." dir을 홈 dir로 설정합니다 (cd와 동일; p.). "cdl"은 저장된 dirs를 나열합니다. ~ / .mydir $ b 대신 ~ / Dropbox / .mydir $ b (또는 ownCloud와 같은 다른 클라우드 서비스)를 사용하면 다른 계정과 컴퓨터에서 선호하는 디렉토리를 사용하는 현명한 방법을 얻을 수 있습니다.


0

내 bash_profile과 .bashrc에서 이와 같이 사용하고 있습니다.

vi .bash_profile
alias dirs="dirs -v"
source d.sh
:wq

vi .bashrc
alias dirs="dirs -v"
:wq

vi d.sh
pushd ~/Documents/GIT/seiso-data
pushd ~/Documents/GIT/ewe/EosRegistry
pushd ~/Documents/GIT_LODGING/site-cookbooks
pushd ~/Documents/CHEF_LODGING
pushd  .
:wq

터미널에서 가장 최근에 사용한 디렉토리로 이동하는 데 도움이됩니다. :-) 그것이 pop-poped를 사용하는 데 도움이되기를 바랍니다. 나는 cd ~ stackednumber를 사용합니다.


0

사용 cd하고하는 것은 cd -당신 만이 가장 최근에 사용 된 디렉토리 사이를 전환 할 수 있습니다. "디렉토리 작업 세트"크기는 2입니다.

을 사용하면 pushd작업 세트에 임의로 많은 수의 디렉토리를 유지할 수 있습니다.

나는 pushd대부분보다는 시간을 사용 cd합니다. 을 사용하여 활성 디렉토리 스택을 구축 pushd directory_name한 후을 사용하여 하루 종일 이동할 수 있습니다 pushd ~#.

pushd dir1
pushd ../dir2
pushd /full/path/to/dir3

# There are now three directories in the stack.

pushd ~3
pushd ~2

# The same three directories are still on the stack, 
# just in a different order.

나는 popd그 디렉토리를 사용하는 것을 알고있을 때 스택에서 디렉토리를 제거하려고 할 때만 거의 사용 하지 않습니다.

디렉토리로 이동하여 스택에서 제거하십시오.

popd ~2

현재 디렉토리에 머무르고 스택에서 다른 디렉토리를 제거하십시오.

popd +2

여러 개의 터미널 창이나 탭을 열 때 (작업중인 각 디렉토리마다 하나씩) 하나의 터미널에서 작업 스타일을 갖습니다. 이렇게하면 화면 공간이 절약되고 디렉토리 경로가 모두 하나의 쉘에서 사용 가능하므로 다음과 같은 작업을 수행 할 수 있습니다.

  • 현재 작업중인 디렉토리 간 파일 복사
  • 거기에 가지 않고 다른 디렉토리에서 파일을 보거나 편집

예 :

cp ~2/myfile.txt ~4
less ~2/myfile.txt

에서는 tcsh아니지만 bash디렉토리 스택을 파일로 저장하고 나중에 복원 할 수도 있습니다.

저장하기:

dirs -S ~/dirstack

복원:

dirs -L ~/dirstack

그렇지 않으면, 단지 대체 ~bash와 예제 =에 사용 tcsh.

pushd =2
popd =4
popd +1

0

푸시 / 팝은 사람들이 생각하기에 '디렉토리 스택을 조작하는'명령으로 이러한 명령을 정의하여 사람들이 명령을 가르치는 경향이 있기 때문에 이해하기가 쉽지 않은 간단한 개념입니다.

다른 방법으로 봅니다.

pushed [folder_name] - [folder_name]으로 cd 하고 dir 스택에서 [folder_name] 인 대상을 문서화 하는 반면 스택의 최상위 디렉토리는 항상 현재 디렉토리입니다

popd- 먼저 스택 위에있는 디렉토리 레코드로 cd 한 다음 스택에서 제거합니다.

dirs -dir 스택을 인쇄합니다 (가장 왼쪽에있는 항목이 현재 디렉토리 인 스택 Db로 처리 될 수 있습니다 (스택의 맨 위)).

가장 널리 사용되는 두 가지 사례는 다음과 같습니다.

사용 사례 1 : 푸시 및 팝을 사용하여 탐색

root@mypc:/main/$ ls
dir1  dir2  dir3  dir4

root@mypc:/main/$ dirs   # prints the current stack
/main

root@mypc:/main/$ pushd dir1    # Will cd to dir1 and document dir1 in dir stack, stack is now:
/main/dir1 /main 
root@mypc:/main/dir1$    # I am now in /main/dir1

root@mypc:/main/dir1$    # Now let's go wild and document whatever I want
root@mypc:/main/dir1$ pushd ../dir2 
root@mypc:/main/dir2$     # Woo I am in /main/dir2
root@mypc:/main/dir2$ pushd ../dir3 
root@mypc:/main/dir3$     # Woo I am in /main/dir3
root@mypc:/main/dir3$ pushd ../dir4 
root@mypc:/main/dir4$     # Woo I am in /main/dir4
root@mypc:/main/dir4$ dirs   # Now dir stack is:
/main/dir4 /main/dir3 /main/dir2 /main/dir1 /main

내가 문서화 한 폴더로 다시 이동하기 위해 위의 작업을 수행했다고 가정 해 봅시다!

수동으로 cd하면 최상위 디렉토리 스택 항목 (항상 현재 디렉토리)에 영향을 미칩니다.

root@mypc:/main/dir4$ cd ..   # Now dir stack is:
# (note that /main appear in the leftmost as well which is the top of the stack)
/main /main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$ 

지금 뒤로 탐색합시다 :

root@mypc:/main$ popd
root@mypc:/main$     # Still in /main since it was at the top of the dir stack
root@mypc:/main$ dirs    # Stack is now:
/main/dir3 /main/dir2 /main/dir1 /main

root@mypc:/main$ popd
root@mypc:/main/dir3$ popd    # Woo in dir3 now, about to navigate to dir2
root@mypc:/main/dir2$ popd    # Woo in dir2, about to navigate to dir1
root@mypc:/main/dir1$ dirs    # Stack is now:
/main

다시 한 번 원하는 디렉토리를 문서화 한 다음 수동으로 다른 디렉토리로 이동하면 스택에 삽입 된 문서 디렉토리로 쉽게 돌아갈 수 있습니다.

사용 사례 2 : 숫자 스택 인덱스를 사용하여 탐색

pushd dir4 dir3 dir2 dir1을 사용하여 푸시했다고 가정 해 봅시다. 이제 dir -v를 실행하면 다음이 표시됩니다.

root@mypc:/main$ dirs -v
 0  /main/dir1  (this is the current dir you are in always)
 1  /main/dir2
 2  /main/dir3
 3  /main/dir4

이제 스택 인덱스를 사용하여 디렉토리와 관련된 모든 Linux 작업을 수행 할 수 있습니다.

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt    # this will run in the background, something like:
# cp /main/dir2/temp.txt  /main/dir3/new_temp.txt

디렉토리 스택에서 특정 항목을 삭제할 수도 있습니다.

root@mypc:/main$ popd ~4

"문서화"라는 단어를 사용하거나 일종의 Db로 dir 스택에 대해 생각하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.