La scelta del titolo della tua domanda è un po 'confusa.
pushd
/ popd
, una csh
funzione copiata da bash
e 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/dir
seguita 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 ~/x
o ~user/x
notazione).
Quindi, se lo stack ha attualmente /a
e /b
, la directory corrente è /here
e stai eseguendo:
pushd /tmp/whatever
popd
pushd
stamperà /tmp/whatever /here /a /b
e popd
produrrà /here /a /b
, no /tmp/whatever
. Questo è indipendente dall'uso della sostituzione dei comandi o meno. popd
non può essere usato per ottenere il percorso della directory precedente, e in generale il suo output non può essere post elaborato (vedere l' array $dirstack
o $DIRSTACK
di 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 pushd
in una subshell. In tal caso, non è possibile modificare la directory di lavoro. È mktemp
quello 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 mktemp
in 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 zsh
funzioni anonime:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
gestore può ripulire la directory nel caso in cui il processo venga sollecitato da un segnale.