Pilha de Diretórios (comandos pushd, popd e dirs)
A Pilha de Diretórios é um recurso do GNU Bash voltado para facilitar a navegação e manipulação de diretórios. É um recurso onde o usuário pode criar "atalhos" dentro de uma pequena base de diretórios que podem ser facilmente acessados ou referenciados dentro de uma seção do shell. Devido a grande popularidade do GNU Bash vale a pena conhecer esse recurso.
Parte 2: A pilha de diretórios e seus comandos - pushd
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
É 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.
Ex.:
user@linux:/var$ pushd -n /usr/share
/var /usr/share /etc ~
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.
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.
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.
#definindo pilha - diretorios mais usados
pushd dir1
pushd dir2
...
pushd dir8
cd
Daí quando abro um terminal já tenho a pilha definida com meus principais diretórios e a partir de agora passarei a navegar com "cd ~[numero]". Show de bola!