Wybór tytułu pytania jest nieco mylący.
pushd
/ popd
, csh
funkcja skopiowana przez bash
i 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/dir
a 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ą ~/x
lub ~user/x
zapisem).
Więc jeśli stos obecnie ma /a
i /b
, bieżący katalog to /here
i działasz:
pushd /tmp/whatever
popd
pushd
będzie drukować /tmp/whatever /here /a /b
i popd
wyjście będzie /here /a /b
, nie /tmp/whatever
. Jest to niezależne od używania podstawiania poleceń, czy nie. popd
nie 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 $dirstack
lub $DIRSTACK
niektó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 pushd
w podpowłoce. Jeśli tak, nie może zmienić katalogu roboczego. To mktemp
dział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 mktemp
w 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ć zsh
funkcji anonimowych:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
moduł obsługi może wyczyścić katalog, jeśli proces zostanie zakłócony sygnałem.