La elección del título de su pregunta es un poco confusa.
pushd/ popd, una cshcaracterística copiada por bashy 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/dirseguido 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 ~/xo ~user/xnotación).
Entonces, si la pila tiene actualmente /ay /b, el directorio actual es /herey está ejecutando:
pushd /tmp/whatever
popd
pushdse imprimirá /tmp/whatever /here /a /by popdsaldrá /here /a /b, no /tmp/whatever. Eso es independiente de usar la sustitución de comandos o no. popdno se puede usar para obtener la ruta del directorio anterior y, en general, su salida no se puede procesar posteriormente (consulte la matriz $dirstacko $DIRSTACKde 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 pushden una subshell. Si lo hizo, no podría cambiar el directorio de trabajo. Eso se mktempejecuta 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 mktempen 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 zshfunciones anónimas:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trapcontrolador puede limpiar el directorio en caso de que el proceso sea activado por una señal.