La scelta del titolo della tua domanda è un po 'confusa.
pushd/ popd, una cshfunzione copiata da bashe zsh, è un modo per gestire una pila di directory memorizzate.
pushd /some/dir
spinge la directory di lavoro corrente su uno stack, quindi cambia la directory di lavoro corrente (e quindi stampa /some/dirseguita dal contenuto di quello stack (separato da spazio).
popd
stampa il contenuto della pila (di nuovo, spazio separato), quindi passa all'elemento superiore della pila e lo estrae dalla pila.
(attenzione anche che alcune directory saranno rappresentate lì con la loro ~/xo ~user/xnotazione).
Quindi, se lo stack ha attualmente /ae /b, la directory corrente è /heree stai eseguendo:
pushd /tmp/whatever
popd
pushdstamperà /tmp/whatever /here /a /be popdprodurrà /here /a /b, no /tmp/whatever. Questo è indipendente dall'uso della sostituzione dei comandi o meno. popdnon può essere usato per ottenere il percorso della directory precedente, e in generale il suo output non può essere post elaborato (vedere l' array $dirstacko $DIRSTACKdi alcune shell anche se per accedere agli elementi di quello stack di directory)
Forse vuoi:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
O
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Tuttavia, vorrei usare:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
In ogni caso, pushd "$(mktemp -d)"non viene eseguito pushdin una subshell. In tal caso, non è possibile modificare la directory di lavoro. È mktempquello che gira in una subshell. Poiché è un comando separato, deve essere eseguito in un processo separato. Scrive l'output su una pipe e il processo shell lo legge sull'altra estremità della pipe.
ksh93 può evitare il processo separato quando il comando è incorporato, ma anche lì, è ancora una subshell (un ambiente di lavoro diverso) che questa volta viene emulato piuttosto che fare affidamento sull'ambiente separato normalmente fornito dal fork. Ad esempio, in ksh93, a=0; echo "$(a=1; echo test)"; echo "$a"non è coinvolto alcun fork, ma vengono comunque echo "$a"emessi 0.
Qui, se si desidera archiviare l'output di mktempin una variabile, contemporaneamente al passaggio a pushd, con zsh, è possibile:
pushd ${tmpdir::="$(mktemp -d)"}
Con altre conchiglie simili a Bourne:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
O per utilizzare l'output di $(mktemp -d)più volte senza memorizzarlo esplicitamente in una variabile, è possibile utilizzare zshfunzioni anonime:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trapgestore può ripulire la directory nel caso in cui il processo venga sollecitato da un segnale.