Pushd, popd 및 cd, bash 및 zsh의 cd

Pushd, popd 및 cd, bash 및 zsh의 cd

bash와 zsh에서 pushd/popd의 동작에 차이가 있습니까? zsh cd에서 cd-는 Pushd/popd와 정확히 동일하게 작동하는 것처럼 보이지만(cd 시 /pops 디렉토리를 자동으로 추가), bash cd에서는 디렉토리 스택에 영향을 주지 않습니다.

누군가 나에게 몇 가지 조언을 해줄 수 있다면 좋을 것입니다.

답변1

때에 따라 다르지. 이전 디렉터리를 디렉터리 스택으로 자동 푸시 zsh하도록 구성할 수 있지만 이것이 cd기본값은 아닙니다.

내가 알 수 있는 한, zsh기본 설정은 다음과 매우 유사하게 동작합니다 bash.

  • cd somedir
    • 디렉토리를 다음으로 변경하십시오.somedir
    • 원본 디렉터리를 다음 위치에 저장하세요.OLDPWD
    • 놓다PWD="somedir"
    • 디렉터리 스택의 최상위 요소(그림 참조 dirs) somedir를 (스택의 동일한 수의 요소)로 바꿉니다.
  • cd -:
    • 디렉토리를 다음으로 변경하십시오.$OLDPWD
    • PWD합계 값을 교환합니다.OLDPWD
    • 반영하도록 디렉토리 스택의 최상위 요소 수정(신규)PWD
  • pushd somedir:
    • 디렉토리를 다음으로 변경하십시오.somedir
    • 원본 디렉터리를 다음 위치에 저장하세요.OLDPWD
    • 놓다PWD="somedir"
    • somedir디렉터리 스택으로 푸시 (한 요소씩 확장)
  • popd:
    • 원본 디렉터리를 다음 위치에 저장하세요.OLDPWD
    • 디렉터리 스택의 첫 번째 요소를 제거합니다.
    • 디렉터리를 디렉터리 스택의 새로운 최상위 요소로 변경합니다.
    • PWD디렉터리 스택의 새로운 최상위 요소로 설정

노트:현재 작업 디렉토리가 디렉토리 스택의 요소로 간주되는지 여부는 zsh와 사이에 다릅니다 bash. bash위 목록을 참고용으로 사용합니다 .

  • 현재 bash작업 디렉터리는 디렉터리 스택의 최상위 요소로 간주됩니다. 설명하다 man 1 bash:

    pushd [-n] [dir]

    dir[...]는 디렉토리 스택의 맨 위에 추가되어 마치 cd내장 함수에 대한 인수로 제공된 것처럼 새로운 현재 작업 디렉토리가 됩니다. […]

    Print DIRSTACK( echo ${dirstack[@]})는 첫 번째 요소가 와 동일함을 확인합니다 $PWD.

  • 현재 zsh작업 디렉터리는 디렉터리 스택의 일부가 아닙니다(그러나 여전히 그렇게 나타납니다 dirs). man 1 zshbuiltins설명하다:

    pushd [ -qsLP ] [ arg ]

    [...]는 현재 디렉터리를 변경하고 이전 현재 디렉터리를 디렉터리 스택에 푸시합니다. 첫 번째 형식에서는 현재 디렉터리를 arg로 변경합니다. […]

    인쇄 dirstack( echo ${dirstack[@]})하고 이를 출력과 비교하면 `dirstack.h의 일부가 dirs아님을 알 수 있습니다 PWD.

두 쉘 모두에서 dirs현재 작업 디렉토리가 첫 번째 요소로 인쇄됩니다. 또한 두 셸 모두에서 색인화된 디렉터리 스택 요소는 1마지막 디렉터리 이전의 현재 디렉터리를 참조합니다 pushd. 이는 일반적으로 배열 안의 번호 는 처음부터 번호가 매겨지는 반면, zsh안의 1배열 은 처음부터 번호가 매겨지기 때문입니다. 그래서 실제 큰 차이는 없습니다0bash


위에서 언급한 대로 이 동작은 에서 수정할 수 있습니다 zsh.

( ) 에서 이 옵션을 설정하면 AUTO_PUSHD이전 디렉터리가 디렉터리 스택에 자동으로 푸시되는 것처럼 동작합니다. 이는 귀하의 컴퓨터에 해당될 수 있습니다. 기본 모드가 설정되지 않은 옵션 목록을 얻기 위해 실행할 수 있습니다. 목록에 나타나는지 확인하세요.zshsetopt autopushdcd somedirpushd somedirsetoptautopushd

cd -그러나 이것 은 그런 행동 을 수정 하지 않습니다 popd. 대신, $PWD디렉토리 스택을 푸시 하고 디렉토리를 로 변경합니다 $OLDPWD. 이는 cd -( )에 대한 반복 호출이 실제로 디렉토리 스택을 증가시킨다는 것을 의미합니다 ($PWD $OLDPWD $PWD $OLDPWD $PWD …). popd시스템에서와 똑같이 작동한다면 cd실제로 내장( whence -v cd)되어 있는지 제안하고 싶습니다. 별칭이나 함수로 대체될 수 있습니다.

활성화되면 디렉토리 스택이 매우 빠르게 커지므로 매개변수를 원하는 최대 크기로 AUTO_PUSHD설정하여 크기를 제한할 수 있습니다 . 중복을 방지하기 위한 옵션을 설정할 수도 있습니다 . 더 많은 옵션을 확인하려면 다음을 확인하세요.DIRSTACKSIZE
PUSHD_IGNORE_DUPS
수동.

관련 정보