질문 제목을 선택하는 것은 약간 혼란 스럽습니다.
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처리기는 신호에 의해 프로세스를 찌를 경우 디렉토리를 정리할 수 있습니다.