O pushd / popd é um conceito tão simples que demorei um pouco para compreender, pois as pessoas tendem a ensiná-lo definindo esses comandos como comandos que 'manipulam a pilha de diretórios' que, na minha opinião, é confusa.
Eu olho para isso de uma maneira diferente:
pushd [nome_da_pasta] - fará o cd para [nome_da_pasta] e documentará o destino que é [nome_da_pasta] em uma pilha de diretórios, enquanto o diretório superior da pilha será sempre o diretório atual em que você está
popd - primeiro coloca você no registro do diretório que está no topo da pilha e depois o remove da pilha
dirs - Imprime a pilha de diretórios (pode ser tratada como o dir Db, onde a entrada mais à esquerda é o diretório atual (parte superior da pilha)
Portanto, os 2 casos de uso mais populares são:
Caso de uso 1: Navegando usando pushd e popd
root@mypc:/main/$ ls
dir1 dir2 dir3 dir4
root@mypc:/main/$ dirs # prints the current stack
/main
root@mypc:/main/$ pushd dir1 # Will cd to dir1 and document dir1 in dir stack, stack is now:
/main/dir1 /main
root@mypc:/main/dir1$ # I am now in /main/dir1
root@mypc:/main/dir1$ # Now let's go wild and document whatever I want
root@mypc:/main/dir1$ pushd ../dir2
root@mypc:/main/dir2$ # Woo I am in /main/dir2
root@mypc:/main/dir2$ pushd ../dir3
root@mypc:/main/dir3$ # Woo I am in /main/dir3
root@mypc:/main/dir3$ pushd ../dir4
root@mypc:/main/dir4$ # Woo I am in /main/dir4
root@mypc:/main/dir4$ dirs # Now dir stack is:
/main/dir4 /main/dir3 /main/dir2 /main/dir1 /main
Digamos que fiz o acima, pois gostaria de voltar para as pastas que documentei!
Observe que, se eu fizer um cd manualmente, afetarei a entrada da pilha de diretórios superior (que é sempre o diretório atual)
root@mypc:/main/dir4$ cd .. # Now dir stack is:
# (note that /main appear in the leftmost as well which is the top of the stack)
/main /main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$
Vamos navegar para trás agora:
root@mypc:/main$ popd
root@mypc:/main$ # Still in /main since it was at the top of the dir stack
root@mypc:/main$ dirs # Stack is now:
/main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$ popd
root@mypc:/main/dir3$ popd # Woo in dir3 now, about to navigate to dir2
root@mypc:/main/dir2$ popd # Woo in dir2, about to navigate to dir1
root@mypc:/main/dir1$ dirs # Stack is now:
/main
Mais uma vez, posso documentar qualquer diretório que eu quero e, em seguida, navegar manualmente para outro diretório, então poderei retornar facilmente ao diretório documentado que inseri na pilha.
Caso de uso 2: Navegando usando o índice de pilha numérica
Vamos dizer que eu enviei usando pushd dir4 dir3 dir2 dir1, agora executando dir -v mostrará:
root@mypc:/main$ dirs -v
0 /main/dir1 (this is the current dir you are in always)
1 /main/dir2
2 /main/dir3
3 /main/dir4
Agora você pode executar qualquer operação do Linux que envolva diretórios usando o índice da pilha:
root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt # this will run in the background, something like:
# cp /main/dir2/temp.txt /main/dir3/new_temp.txt
Você pode até excluir uma entrada específica da pilha de diretórios:
root@mypc:/main$ popd ~4
Espero que o uso das palavras "documentando" ou pense na pilha de diretórios como algum tipo de Db simplifique o conceito!
cd -
, aliases para encurtamentocd ..
etc.).