En bash, solemos utilizar atajos del comando «cd», como por ejemplo cd -
que devuelve la shell al directorio anterior o cd
que nos lleva a la home de usuario. No obstante, bash ofrece una serie de comandos (dirs, popd y pushd) para controlar un stack/pila de directorios más avanzada sobre la que podemos añadir, quitar o consultar directorios que luego podemos utilizar para volver a acceder a ellos.
La ventaja de estos comandos sobre «cd -» es que este último solamente guarda el anterior directorio mientras que con pushd podemos almacenar tantos directorios como queramos.
La teoría sobre estos tres comandos es la siguiente:
- pushd: guarda el directorio actual al principio del stack de directorios. Si le pasamos como parámetro un directorio guardará el directorio actual y el especificado (este último primero).
- popd: elimina el primer directorio del stack de directorios y hace un «cd» contra ese directorio.
- dirs: muestra el listado de directorios almacenados en el stack.
Ejemplo práctico básico
Guardar 3 directorios en el stack + en el que nos encontramos al principio (home del usuario ~)
[~] $ pushd /usr/local/etc/ /usr/local/etc ~
[/usr/local/etc] $ pushd /var/tmp/ /var/tmp /usr/local/etc ~
[/var/tmp] $ pushd /home/ /home /var/tmp /usr/local/etc ~
Listar el stack de directorios:
[/home] $ dirs -v 0 /home 1 /var/tmp 2 /usr/local/etc 3 ~
Acceder a los directorios con popd en orden inverso a como los hemos añadido:
[/home] $ popd /var/tmp /usr/local/etc ~
[/var/tmp] $ popd /usr/local/etc ~
[/usr/local/etc] $ popd ~
[~] $ popd bash: popd: directory stack empty
Si no queremos acceder en orden inverso sino a un directorio concreto lo podemos hacer a partir de su ID:
[/var/tmp] $ dirs -v 0 /var/tmp 1 /usr/local/etc 2 ~
[/var/tmp] $ cd $(dirs +1)
[/usr/local/etc] $ pwd /usr/local/etc
Así que ya sabéis, cuando estéis dentro de una ruta infernal y tengáis que cambiar de directorio para volver a acceder al rato, la guardáis con pushd y luego ejecutáis popd para volver. Con esto seguro que evitáis tener abrir varias shells o terminales en algunas ocasiones.