2012-03-28 7 views
5

No sé si hay una forma válida de hacerlo. Pero, siempre he querido ver si es posible.pushd popd pila de directorio global?

sé que pushd, popd y directorios son útiles para una serie de cosas como copiar entre directorios que ha visitado recientemente.

embargo, hay una manera en la que se puede mantener una pila global? De modo que si presiono algo (usando pushd) en un terminal, se refleja en otro (tal vez solo los terminales en esa sesión de inicio de sesión).

+0

comandos Pushd y popd se BuiltIn comandos y la pila dir es mantenido por cada proceso shell. Sí, hay una manera de tener una pila global. De muchas maneras, de hecho. ¿Has intentado algo tú mismo? –

Respuesta

4

Usted debe ser capaz de hacer esto con un par de funciones de shell y un archivo temporal.

El archivo temporal se llamará algo así como '/home/me/.directory_stack' y simplemente contener una lista de directorios:

/home/me 
/etc 
/var/log 

Su función 'push_directory' simplemente agregar el directorio actual a la lista. La función 'pop_directory' sacaría el más reciente fuera de la lista y cambiaría a ese directorio. Almacenar la pila en un archivo como este asegura que la información exista en todos los terminales abiertos (e incluso entre reinicios).

Estas son algunas de las funciones de ejemplo (ADVERTENCIA: Sólo ligeramente probados)

directory_stack=/home/me/.directory_stack 
function push_dir() { 
    echo $(pwd) >> $directory_stack 
    cd $1 
} 
function pop_dir() { 
    [ ! -s $directory_stack ] && return 
    newdir=$(sed -n '$p' $directory_stack) 
    sed -i -e '$d' $directory_stack 
    cd $newdir 
} 

añadir que a su .bashrc y que automáticamente van a ser definidas cada vez que inicie sesión en la cáscara.

+0

Bah, parece que Sarnold tuvo la misma idea que yo y me golpeó hasta el golpe. Dejaré mi respuesta ya que usa una técnica diferente, pero para que conste, fue el primero. – bta

+0

Los programas 'sed '$ p'' y' sed' $ d''son _perfect_; mucho mejor que mi horrible aritmética. Pensé que las herramientas estándar de Unix deberían tener un mecanismo más fácil para eliminar y devolver la última línea de un archivo ... – sarnold

3

Es probable que desee escribir algunas funciones de shell y utilizarlas en lugar de pushd y popd. Algo así como las funciones siguientes (no probado) podría hacer el trabajo:

mypushd() { echo "$1" >> ~/.dir_stack ; cd "$1" } 
mypopd() { dir=`tail -1 ~/.dir_stack` ; cd "$dir" ; 
      foo=`wc -l ~/.dir_stack | egrep -o '[0-9]+'` ; 
      ((foo=$foo-1)) ; 
      mv ~/.dir_stack ~/.dir_stack_old ; 
      head -n $foo ~/.dir_stack_old > ~/.dir_stack } 

Se podría deshacerse de algunos de los bits más feas si se escribe un pequeño programa que devuelve y elimina la última línea del archivo.

+0

¡Gracias! Esto parece rápido y simple. Trataré de duplicar esto en python/perl si es necesario. Inicialmente estaba pensando si bash en sí tenía alguna variable de entorno para hacer esto. Supongo que no es el caso. –

+0

El problema al tratar de volver a hacer esto en Python o Perl es que la llamada al sistema 'chdir (2)' solo puede influir en el proceso actual. Si realmente quieres esto en Python, también te gustaría mirar [IPython] (http://ipython.org/) - Entiendo que intenta ser un reemplazo de shell para las tareas de computación interactiva. Pero si quiere seguir usando su caparazón, no pierda el tiempo tratando de reproducir estas funciones en cualquier otro idioma - [la respuesta de bta] (http://stackoverflow.com/a/9916812/377270) es probablemente la mejor puedes prescindir de una gran cantidad de trabajo. – sarnold