Le choix du titre de votre question est un peu déroutant.
pushd
/ popd
, une csh
fonctionnalité copiée par bash
et zsh
, est un moyen de gérer une pile de répertoires mémorisés.
pushd /some/dir
pousse le répertoire de travail en cours sur une pile, puis modifie le répertoire de travail en cours (puis imprime /some/dir
suivi du contenu de cette pile (séparé par des espaces).
popd
imprime le contenu de la pile (là encore, séparé par des espaces), puis passe à l'élément supérieur de la pile et le fait disparaître de la pile.
(attention également à ce que certains répertoires y seront représentés avec leur notation ~/x
ou ~user/x
).
Donc, si la pile contient actuellement /a
et /b
, le répertoire actuel est /here
et vous exécutez:
pushd /tmp/whatever
popd
pushd
imprimera /tmp/whatever /here /a /b
et popd
sortira /here /a /b
, non /tmp/whatever
. C'est indépendant de l'utilisation de la substitution de commandes ou non. popd
ne peut pas être utilisé pour obtenir le chemin du répertoire précédent, et en général, sa sortie ne peut pas être post-traitée (voir le tableau $dirstack
ou $DIRSTACK
de certains shells pour accéder aux éléments de cette pile de répertoires)
Peut-être que vous voulez:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Ou
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Cependant, j'utiliserais:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
Dans tous les cas, pushd "$(mktemp -d)"
ne s'exécute pas pushd
en sous-shell. Si tel était le cas, il ne pourrait pas modifier le répertoire de travail. Voilà mktemp
qui fonctionne en sous-coquille. Comme il s'agit d'une commande distincte, elle doit s'exécuter dans un processus distinct. Il écrit sa sortie sur un tuyau et le processus shell la lit à l'autre extrémité du tuyau.
ksh93 peut éviter le processus séparé lorsque la commande est intégrée, mais même là, c'est toujours un sous-shell (un environnement de travail différent) qui cette fois est émulé plutôt que de s'appuyer sur l'environnement séparé normalement fourni par la fourche. Par exemple, dans ksh93
, a=0; echo "$(a=1; echo test)"; echo "$a"
, aucune fourchette est impliquée, mais encore echo "$a"
sorties 0
.
Ici, si vous voulez stocker la sortie de mktemp
dans une variable, en même temps que vous la passez à pushd
, avec zsh
, vous pouvez faire:
pushd ${tmpdir::="$(mktemp -d)"}
Avec d'autres coques de type Bourne:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Ou pour utiliser $(mktemp -d)
plusieurs fois la sortie sans la stocker explicitement dans une variable, vous pouvez utiliser zsh
des fonctions anonymes:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
gestionnaire peut nettoyer le répertoire si le processus est poussé par un signal.