directorio actual push / pop?

66

Con bash, ¿hay alguna manera de empujar y hacer estallar el directorio de trabajo actual? Intenté escribir bash;cd dir; ./dostuff;exit;pero el directorio actual es ahora dir.


fuente

Respuestas:

91

Hay pushdypopd

Bash mantendrá un historial de los directorios que visite, solo tiene que preguntar. Bash almacena el historial en una pila y usa los comandos pushd y popd para administrar la pila.

Más para leer

Ejemplo:

$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me
Nifle
fuente
1
Extracto del enlacepushd Saves the current directory on the top of the directory stack and then cd to dir. With no arguments, pushd exchanges the top two directories.
Jefe Maestro
31

La llamada bashinicia una nueva subshell, que tiene su propia entrada; ninguno de los otros comandos se ejecutará hasta que salga. Rodeando los comandos que se ejecutarán con parens también se iniciará una nueva subshell, pero ejecutará los comandos dentro de ella.

( cd dir ; ./dostuff )
Ignacio Vazquez-Abrams
fuente
1
¡Brillante! No es necesario presionar / saltar cuando la intención es simplemente ejecutar un comando en un directorio diferente (por ejemplo, actualizar una dependencia) y luego volver al actual.
Dan Dascalescu
12

Si no necesita múltiples niveles de historial de directorio, también puede hacer:

cd foo
# do your stuff in foo
cd -

En comparación con pushd/ popd, esto tiene la desventaja de que si cd foofalla, termina en el directorio incorrecto con cd -.

(Probablemente cd -sea ​​más útil fuera de los guiones. "Volvamos a donde estaba").

tuomassalo
fuente
4

Utilizo el alias para realizar un seguimiento de los cambios de mi directorio, así que para 'cd' en algún lugar puedo volver a donde estaba usando 'cd.', O regresar dos usando 'cd ..', etc.

alias pushdd="pushd \$PWD > /dev/null"
alias cd='pushdd;cd'
alias ssh='ssh -A'
alias soc='source ~/.bashrc'
#below to go back to a previous directory (or more)
alias popdd='popd >/dev/null'
alias cd.='popdd'
alias cd..='popdd;popdd'
alias cd...='popdd;popdd;popdd'
alias cd....='popdd;popdd;popdd;popdd'
#below to remove directories from the stack only (do not 'cd' anywhere)
alias .cd='popd -n +0'
alias ..cd='popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0'
cdp
fuente
1
¿Puedes explicar con más detalle lo que hace este código?
bwDraco
Eso es inteligente. Tengo alias alrededor de mi pushd y popd para hacer algunas cosas que me gustan. Yo uso la pila de directorios todo el tiempo. Odio ver a la gente cd en alguna parte y luego retroceder buscando el directorio anterior para cortar y pegar. No puedo hacer la mayor parte de mi trabajo en mi directorio principal debido a las cuotas, por lo que tengo que usar el almacenamiento agrupado en la red.
Michael Mathews
1
¿Es el alias ..cdlo suficientemente robusto? parece que solo elimina los últimos 10 elementos de la pila.
reynoldsnlp