질문 제목을 선택하는 것은 약간 혼란 스럽습니다.
pushd
/ popd
하는 csh
기능에 의해 복사 bash
하고 zsh
, 기억 디렉토리의 스택을 관리하는 방법입니다.
pushd /some/dir
푸시 현재 스택 상 작업 디렉토리, 그리고 다음 인쇄합니다 후 현재 디렉토리를 변경하는 (그리고 /some/dir
그 스택의 콘텐츠 하였다 () 공간으로 구분.
popd
스택의 내용을 다시 인쇄하고 (격리 된 공간) 스택의 맨 위 요소로 변경하여 스택에서 튀어 나옵니다.
(또한 일부 디렉토리는 해당 디렉토리 ~/x
또는 ~user/x
표기법 으로 표시 될 것입니다 ).
스택은 현재 보유하고 경우에 따라서 /a
하고 /b
, 현재 디렉토리는 /here
당신이 실행중인 :
pushd /tmp/whatever
popd
pushd
인쇄 할 /tmp/whatever /here /a /b
과 popd
의지 출력을 /here /a /b
하지 /tmp/whatever
. 그것은 명령 대체를 사용하는 것과 무관합니다. popd
이전 디렉토리의 경로를 얻는 데 사용할 수 없으며 일반적으로 출력을 포스트 처리 할 수 없습니다 ( 해당 디렉토리 스택의 요소에 액세스하려면 일부 쉘의 배열 $dirstack
또는 $DIRSTACK
배열 참조 )
어쩌면 당신은 원할 것입니다 :
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
또는
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
그래도 사용합니다 :
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
어쨌든 서브 쉘에서 pushd "$(mktemp -d)"
실행되지 않습니다 pushd
. 그렇다면 작업 디렉토리를 변경할 수 없습니다. 그것이 mktemp
서브 쉘에서 실행됩니다. 별도의 명령이므로 별도의 프로세스에서 실행해야합니다. 파이프에 출력을 기록하고 쉘 프로세스는 파이프의 다른 쪽 끝에서 출력을 읽습니다.
ksh93은 명령이 내장되어있을 때 별도의 프로세스를 피할 수 있지만, 여전히 포킹으로 제공되는 별도의 환경에 의존하기보다는 서브 쉘 (다른 작업 환경)이 에뮬레이트됩니다. 예를 들어,에 ksh93
, a=0; echo "$(a=1; echo test)"; echo "$a"
어떤 포크는 아직 포함되지되지만 echo "$a"
출력 0
.
당신의 출력을 저장하려면 여기, mktemp
당신이 그것을 통과 동시에 변수에, pushd
로를 zsh
, 당신은 할 수 있습니다 :
pushd ${tmpdir::="$(mktemp -d)"}
다른 Bourne과 같은 껍질 :
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
또는 $(mktemp -d)
변수에 명시 적으로 저장하지 않고 여러 번 출력을 사용하려면 zsh
익명 함수를 사용할 수 있습니다 .
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
처리기는 신호에 의해 프로세스를 찌를 경우 디렉토리를 정리할 수 있습니다.