bash와 zsh의 push, popd vs cd, cd- 스택에 영향을 미치지 않는

bash와 zsh에서 push / popd의 동작에는 차이가 있습니까? zsh cd에서는 cd-가 bash cd가 dir 스택에 영향을 미치지 않는 동안 pushd / popd (cd 일 때 자동으로 디렉토리 추가 / pop)와 정확히 동일하게 동작합니다.

누군가 나에게 훌륭한 포인터를 줄 수 있다면.



답변

때에 따라 다르지. 에서 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디렉토리 스택의 새로운 최상위 요소로 설정

참고 : 현재 작업 디렉토리의 디렉토리 스택 다릅니다의 요소로 간주됩니다 여부 zshbash. bash위의 목록에 대한 참조로 사용 했습니다.

  • 에서는 bash현재 디렉토리 디렉토리 스택의 최상위 요소로 간주된다. 는 man 1 bash말한다 :

    pushd [-n] [dir]

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

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

  • 에서 zsh현재 작업 디렉토리 디렉토리 스택의 일부 (하지만 여전히 함께 표시되지 않습니다 dirs). man 1 zshbuiltins말한다 :

    pushd [ -qsLP ] [ arg ]

    […] 현재 디렉토리를 변경하고 이전 현재 디렉토리를 디렉토리 스택으로 푸시하십시오. 첫 번째 양식에서 현재 디렉토리를 arg로 변경하십시오. […]

    인쇄 dirstack( echo ${dirstack[@]})과의 출력과 비교 dirs(가) 것을 표시한다 PWDDIRSTACK ‘의 일부가 아니다.

두 쉘 모두 dirs에서 현재 작업 디렉토리를 첫 번째 요소로 인쇄합니다. 또한 두 쉘 모두에서 색인이있는 디렉토리 스택 요소 1는 마지막 이전의 디렉토리를 참조합니다 pushd. in의 배열 zsh은 일반적으로에서 번호 1가 매겨지고 반면에는 0in의 번호가 매겨 지기 때문 입니다 bash. 따라서 실질적인 차이는 거의 없습니다


위에서 말했듯이이 동작은에서 수정할 수 있습니다 zsh.

당신이 설정 한 경우 AUTO_PUSHD에 옵션을 zsh( setopt autopushd) cd somedir동작합니다 좋아 pushd somedir, 이전 디렉토리가 자동으로 디렉토리 스택으로 푸시됩니다. 이것은 아마도 컴퓨터의 경우 일 것입니다. setopt기본 방법으로 설정되지 않은 옵션 목록을 얻기 위해 실행할 수 있습니다 . autopushd목록에 나타나는지 확인하십시오 .

그러나 이렇게 cd -동작하도록 수정되지 않습니다 popd. 대신 $PWD디렉토리 스택으로 푸시 하고 디렉토리를로 변경합니다 $OLDPWD. 즉, 반복적으로 호출 cd -하면 실제로 디렉토리 스택이 증가합니다 ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). 실제로 popd시스템에서 와 똑같이 작동 하면 cd실제로 내장 ( whence -v cd) 인지 제안합니다 . 별명 또는 함수로 대체 될 수 있습니다.

AUTO_PUSHD활성화되면 디렉토리 스택이 다소 빠르게 커지 므로 매개 변수 DIRSTACKSIZE를 원하는 최대 크기 로 설정하여 크기를 제한 할 수 있습니다 . 옵션
을 설정하여 중복을 방지 할 수도 PUSHD_IGNORE_DUPS있습니다.
더 많은 옵션은 매뉴얼을 참조하십시오 .


답변