bash에서 가져온 스크립트가 있습니다. 그것은 모든 종류의 작업을 수행하고 $PWD
구입하기 전의 상태를 유지합니다.
pushd ~/.dotfiles >/dev/null || exit 1
# Do various things
popd >/dev/null || exit 1
스크립트는 zsh에서도 (대부분) 잘 작동하지만 ~/.dotfiles
해당 위치에서 가져올 때 가져온 후 이전 위치로 이동하게 됩니다 $OLDPWD
.
pushd
zsh는 현재 위치가 이미 동일한 경우 해당 줄을 무시하는 것으로 보이므로 popd
명령은 $OLDPWD
스크립트 소스 이전 위치로 이동합니다.
pushd
스크립트를 bash와 호환되게 유지하면서 zsh가 "중복" 명령을 무시하는 것을 방지할 수 있는 방법이 있습니까 ?
내 파일에는 다음이 있지만 .zshrc
설정을 해제해도 이런 현상이 발생합니다.
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_IGNORE_DUPS
답변1
pushd
상호 작용을 촉진 하도록 설계되었습니다 popd
. 스크립트에서는 신뢰할 수도 없고 유용하지도 않습니다.
당신이 보는 효과는pushd_ignore_dups
, 이는 기본적으로 꺼져 있지만 구성에서 활성화한 것으로 보입니다.
pushd
and의 또 다른 잠재적인 문제는 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
아니요, 디렉터리에 있는 동안 터미널이 닫혀 있기 때문에 실제로 작동하지 않습니다 .