zsh에서 스크립트를 가져올 때 Pushd/popd 동작 혼동

zsh에서 스크립트를 가져올 때 Pushd/popd 동작 혼동

bash에서 가져온 스크립트가 있습니다. 그것은 모든 종류의 작업을 수행하고 $PWD구입하기 전의 상태를 유지합니다.

pushd ~/.dotfiles >/dev/null || exit 1

# Do various things

popd >/dev/null || exit 1

스크립트는 zsh에서도 (대부분) 잘 작동하지만 ~/.dotfiles해당 위치에서 가져올 때 가져온 후 이전 위치로 이동하게 됩니다 $OLDPWD.

pushdzsh는 현재 위치가 이미 동일한 경우 해당 줄을 무시하는 것으로 보이므로 popd명령은 $OLDPWD스크립트 소스 이전 위치로 이동합니다.

pushd스크립트를 bash와 호환되게 유지하면서 zsh가 "중복" 명령을 무시하는 것을 방지할 수 있는 방법이 있습니까 ?

내 파일에는 다음이 있지만 .zshrc설정을 해제해도 이런 현상이 발생합니다.

setopt AUTO_PUSHD PUSHD_SILENT PUSHD_IGNORE_DUPS

답변1

pushd상호 작용을 촉진 하도록 설계되었습니다 popd. 스크립트에서는 신뢰할 수도 없고 유용하지도 않습니다.

당신이 보는 효과는pushd_ignore_dups, 이는 기본적으로 꺼져 있지만 구성에서 활성화한 것으로 보입니다.

pushdand의 또 다른 잠재적인 문제는 popd실제로 쌍으로 호출해야 한다는 것입니다. popd잘못된 경로에서 실수로 a를 생략하여 여기저기서 혼란을 야기할 위험이 높습니다.

가져올 도우미 스크립트에서는 일반적으로 현재 디렉터리를 전혀 변경하면 안 됩니다. 어디에서나 절대 경로를 사용하십시오.

현재 디렉터리를 정말로 변경하려면 이 cd명령을 사용하세요. 이전 현재 디렉터리를 변수에 저장합니다.

# instead of pushd...
foo_old_pwd=$PWD
cd /foo/directory

# instead of popd...
cd "$foo_old"

pushd이는 모든 Bourne 스타일 쉘( 및 를 구현하지 않은 쉘 포함 popd)에서 작동하며 잘못된 디렉토리는 절대 복원되지 않습니다.

그러나 디렉터리를 종료하고 그 디렉터리로 돌아가는 것을 기반으로 하는 모든 코드는 한 가지 예외, 즉 원래 디렉터리로 다시 변경할 수 있는 권한이 없는 경우 중단됩니다. 이는 프로세스가 권한을 잃을 때 발생할 수 있습니다.

답변2

if-then-else현실에서 나오는 답이 필요합니다 .

if [ $PWD == ~/.dotfiles ] 
then nopopd=true
else pushd ~/.dotfiles >/dev/null || exit 1
fi

# Do various things

[[ ! $nopopd == true ]] && popd >/dev/null || exit 1

참고하세요

  • 이것은 테스트되지 않았습니다
  • 여전히 필요한지 또는 조건( ||) 이 pushd충족되는지 확실하지 않음
  • Giles의 답변 읽기

답변3

나는 이것을 시도했고 이것이 효과가 있는 것 같지만 꽤 무서워 보이기 때문에 다른 더 나은 방법을 알고 싶습니다.

[[ $PWD == ~/.dotfiles ]] && nopopd=true
pushd ~/.dotfiles >/dev/null || exit 1

# Do various things

[[ ! $nopopd == true ]] && popd >/dev/null || exit 1

고쳐 쓰다~/.dotfiles아니요, 디렉터리에 있는 동안 터미널이 닫혀 있기 때문에 실제로 작동하지 않습니다 .

관련 정보