Wybór tytułu pytania jest nieco mylący.
pushd/ popd, cshfunkcja skopiowana przez bashi zsh, jest sposobem zarządzania stosem zapamiętanych katalogów.
pushd /some/dir
wypycha bieżący katalog roboczy na stos, a następnie zmienia bieżący katalog roboczy (a następnie drukuje, /some/dira następnie zawartość tego stosu (rozdzieloną spacjami).
popd
drukuje zawartość stosu (ponownie, oddzielając spację), a następnie zmienia się na górny element stosu i wyskakuje ze stosu.
(strzeż się również, że niektóre katalogi będą tam reprezentowane wraz z ich notacją ~/xlub ~user/xzapisem).
Więc jeśli stos obecnie ma /ai /b, bieżący katalog to /herei działasz:
pushd /tmp/whatever
popd
pushdbędzie drukować /tmp/whatever /here /a /bi popdwyjście będzie /here /a /b, nie /tmp/whatever. Jest to niezależne od używania podstawiania poleceń, czy nie. popdnie można użyć do uzyskania ścieżki do poprzedniego katalogu i ogólnie jego dane wyjściowe nie mogą zostać przetworzone (patrz jednak tablica $dirstacklub $DIRSTACKniektórych powłok w celu uzyskania dostępu do elementów tego stosu katalogów)
Może chcesz:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Lub
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Chociaż użyłbym:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
W każdym razie pushd "$(mktemp -d)"nie działa pushdw podpowłoce. Jeśli tak, nie może zmienić katalogu roboczego. To mktempdziała w podpowłoce. Ponieważ jest to osobne polecenie, musi działać w osobnym procesie. Zapisuje dane wyjściowe na potoku, a proces powłoki odczytuje je na drugim końcu potoku.
ksh93 może uniknąć oddzielnego procesu, gdy polecenie jest wbudowane, ale nawet tam jest to podpowłoka (inne środowisko robocze), które tym razem jest emulowane, zamiast polegać na oddzielnym środowisku zapewnianym zwykle przez rozwidlenie. Na przykład, w ksh93, a=0; echo "$(a=1; echo test)"; echo "$a"żaden rozwidlenie nie jest zaangażowane, ale nadal echo "$a"generuje 0.
Tutaj, jeśli chcesz przechowywać dane wyjściowe mktempw zmiennej, w tym samym czasie jak przekazać go pushd, z zsh, można zrobić:
pushd ${tmpdir::="$(mktemp -d)"}
Z innymi pociskami podobnymi do Bourne'a:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Lub, aby użyć wyniku $(mktemp -d)kilka razy bez wyraźnego przechowywania go w zmiennej, możesz użyć zshfunkcji anonimowych:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trapmoduł obsługi może wyczyścić katalog, jeśli proces zostanie zakłócony sygnałem.