O GNU Bash pode armazenar uma lista (em formato de pilha) dos diretórios visitados recentemente em uma seção de uso, lembrando que até mesmo cada script de GNU Bash é uma seção independente. O comando interno "
pushd" tem a capacidade de mudar o diretório corrente (tal como o comando interno cd) e ao mesmo tempo insere esse diretório à pilha de diretórios. O comando "
popd" remove o diretório especificado da pilha e muda o diretório corrente para este. Já o comando interno "
dirs" mostra o conteúdo da pilha de diretórios.
Comandos internos para manipulação e navegação na pilha de diretórios
pushd
pushd [-n] [+N | -N | dir ]
É o principal comando de manipulação da pilha de diretórios, executa a entrada de um novo diretório na pilha e também executa a alternância entre as posições de diretórios armazenadas na pilha.
Sua sintaxe é simples, ao entrar com o comando seguido de um diretório como argumento ele irá armazenar o diretório corrente no topo da pilha e posteriormente mudará o diretório corrente para o que foi informado na linha de comando. O pushd executará esse mesmo processo independente de quantas mudanças de diretório forem executada e acumulará um histórico dos diretórios alternados dentro da pilha.
Ex.:
user@linux:~$
pushd /etc
/etc ~
user@linux:/etc$
pushd /var
/var /etc ~
O comando pushd, no ato de sua execução, já exibe como saída o conteúdo da pilha de diretórios. No primeiro exemplo acima temos o diretório corrente (~) sobre o diretório que o usuário indicou (/etc). Já na segunda execução do comando podemos reparar que a pilha aumentou constando 3 diretórios nela. Na exibição do conteúdo da pilha de diretórios importa dizer que o primeiro diretório exibido da esquerda para a direita é sempre o diretório corrente.
-n
O único argumento opcional disponível é o "-n", este é utilizado para o preenchimento da pilha de diretórios sem executar a mudança do diretório atual (não executa o dir após salvar o diretório).
Ex.:
user@linux:/var$
pushd -n /usr/share
/var /usr/share /etc ~
[+N | -N]
Este é o segundo tipo de argumento que o pushd aceita, no caso estes são os direcionais de navegação na pilha de diretórios.
Aqui é importante entender a forma em que é feita a leitura dessa pilha. No caso a contagem é executada de forma diferente, dependendo do argumento direcional usado, porém independente do direcional a contagem sempre irá começar por 0 (zero), após isso cada elemento será incrementado da esquerda para a direita no caso do argumento +N e da direita para a esquerda no caso do argumento -N. O seguinte esquema exemplifica esse conceito.
+N ===>
/var/log /usr/share /etc ~ # -- Conteúdo da pilha de diretórios
| 0 | +1 | +2 |+3
-N <===
/var/log /usr/share /etc ~ # -- Conteúdo da pilha de diretórios
| -3 | -2 | -1 |-0
Assim executando a correta leitura da pilha de diretórios podemos usar os direcionais, mantendo o mesmo exemplo de pilha acima.
Ex.:
/var/log /usr/share /etc ~
# -- Conteúdo da pilha de diretórios
user@linux:/var/log$
pushd +2 # -- Mudamos para o 2º elemento da esq => dir
/etc ~ /var/log /usr/share
# -- Conteúdo da pilha de diretórios atualizado
user@linux:/etc$
pushd -1 # -- Mudamos para o 1º elemento da dir => esq
/var/log /usr/share /etc ~
# -- Conteúdo da pilha de diretórios atualizado
user@linux:/var/log$
Se o comando pushd for inserido sem nenhum argumento sempre será assumido o argumento +1. Continuando o exemplo acima:
user@linux:/var/log$
pushd
/usr/share /var/log /etc ~
user@linux:/usr/share$
Um detalhe importante é que sempre o primeiro diretório da esquerda para a direita será o diretório corrente. Dessa forma o +0 é inútil pois ele representa o diretório corrente, porém o -0 é utilizável para ficar fácil de entender no exemplo acima ele seria a mesma coisa do que o elemento +3.