La elección del título de su pregunta es un poco confusa.
pushd
/ popd
, una csh
característica copiada por bash
y zsh
, es una forma de administrar una pila de directorios recordados.
pushd /some/dir
empuja el directorio de trabajo actual a una pila y luego cambia el directorio de trabajo actual (y luego imprime /some/dir
seguido por el contenido de esa pila (separados por espacios).
popd
imprime el contenido de la pila (de nuevo, separados por espacios) y luego cambia al elemento superior de la pila y lo saca de la pila.
(también tenga en cuenta que algunos directorios estarán representados allí con su ~/x
o ~user/x
notación).
Entonces, si la pila tiene actualmente /a
y /b
, el directorio actual es /here
y está ejecutando:
pushd /tmp/whatever
popd
pushd
se imprimirá /tmp/whatever /here /a /b
y popd
saldrá /here /a /b
, no /tmp/whatever
. Eso es independiente de usar la sustitución de comandos o no. popd
no se puede usar para obtener la ruta del directorio anterior y, en general, su salida no se puede procesar posteriormente (consulte la matriz $dirstack
o $DIRSTACK
de algunos shells para acceder a los elementos de esa pila de directorios)
Quizás quieras:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
O
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Sin embargo, usaría:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
En cualquier caso, pushd "$(mktemp -d)"
no se ejecuta pushd
en una subshell. Si lo hizo, no podría cambiar el directorio de trabajo. Eso se mktemp
ejecuta en una subshell. Dado que es un comando separado, debe ejecutarse en un proceso separado. Escribe su salida en una tubería, y el proceso de shell lo lee en el otro extremo de la tubería.
ksh93 puede evitar el proceso por separado cuando el comando está integrado, pero incluso allí, sigue siendo una subshell (un entorno de trabajo diferente) que esta vez se emula en lugar de depender del entorno separado que normalmente proporciona la bifurcación. Por ejemplo, en ksh93
, a=0; echo "$(a=1; echo test)"; echo "$a"
no hay una bifurcación involucrada, pero aún se echo "$a"
emite 0
.
Aquí, si desea almacenar la salida mktemp
en una variable, al mismo tiempo que se le pasa a pushd
, con zsh
, usted podría hacer:
pushd ${tmpdir::="$(mktemp -d)"}
Con otras conchas tipo Bourne:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
O para usar la salida de $(mktemp -d)
varias veces sin almacenarla explícitamente en una variable, puede usar zsh
funciones anónimas:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
controlador puede limpiar el directorio en caso de que el proceso sea activado por una señal.