Como uso os comandos pushd e popd?

271

Quais são os usos práticos de ambos os pushd e popd quando há uma vantagem de usar esses dois comandos sobre cd e cd - ?

EDIT : Estou procurando alguns exemplos práticos de uso para esses dois comandos ou motivos para manter a pilha com diretórios (quando você tem conclusão de tabulação, cd - , aliases para encurtar cd .. , etc.).

    
por syntagma 25.05.2013 / 19:41

8 respostas

253

pushd , < href="http://www.gnu.org/software/bash/manual/html_node/Directory-Stack-Builtins.html#Directory-Stack-Builtins"> popd e dirs são construções de shell que permitem manipular o < uma pilha de diretórios . Isso pode ser usado para alterar diretórios, mas retornar ao diretório do qual você veio.

Por exemplo

inicie com os seguintes diretórios:

$ ls
dir1  dir2  dir3

pushd para dir1

$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir
O comando

dirs confirma que temos 2 diretórios na pilha agora. dir1 e o diretório original, somedir .

pushd para ../dir3 (porque estamos dentro de dir1 agora)

$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3

dirs mostra que temos 3 diretórios na pilha agora. dir3 , dir1 e somedir . Observe a direção. Todo novo diretório está sendo adicionado à esquerda. Quando começamos a publicar diretórios, eles também vêm da esquerda.

altere manualmente os diretórios para ../dir2

$ cd ../dir2
$ pwd
/home/saml/somedir/dir2

Agora comece a criar diretórios

$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1

Observe que voltamos para dir1 .

Pop novamente ...

$ popd
~/somedir    
$ pwd
/home/saml/somedir

E voltamos aonde começamos, somedir .

Pode ficar um pouco confuso, mas o chefe da pilha é o diretório em que você está. Por isso, quando voltarmos para somedir , mesmo que dirs mostre isso:

$ dirs
~/somedir

Nossa pilha é de fato vazia.

$ popd
bash: popd: directory stack empty
    
por 25.05.2013 / 20:05
152

Existe um caso de uso realmente útil para pushd e popd comandos para trabalhar com várias pastas simultaneamente.

Você pode navegar pela pilha com muita facilidade, já que ela é enumerada. Ou seja, você pode ter várias pastas de trabalho à sua disposição durante o trabalho.

Veja um exemplo simples abaixo.

Primeiro, vamos criar um exemplo de estrutura de pastas.

    user@vb:~$ mkdir navigate
    user@vb:~/navigate$ mkdir dir1
    user@vb:~/navigate$ mkdir dir2
    user@vb:~/navigate$ mkdir dir3

Depois, você pode adicionar todas as suas pastas à pilha:

    user@vb:~/navigate$ pushd dir1/
    ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir1$ pushd ../dir2/
    ~/navigate/dir2 ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

Você pode pesquisar por:

    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir2
     2  ~/navigate/dir1
     3  ~/navigate

Para navegar com segurança, você precisa adicionar a última (zero) pasta duas vezes, pois ela sempre será reescrita:

    user@vb:~/navigate/dir3$ pushd .
    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Agora, você pode percorrer essas pastas e trabalhar com pilha, como com os aliases das pastas. Eu acho que a seguinte parte é auto-explicativa:

    user@vb:~/navigate/dir3$ cd ~4
    user@vb:~/navigate$ dirs -v
     0  ~/navigate
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate$ cd ~3
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate/dir1$ touch text.txt
    user@vb:~/navigate/dir1$ cp text.txt ~2
    user@vb:~/navigate/dir1$ ls ~2
    text.txt
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Dica adicional é criar um alias para dirs -v .

Por exemplo:

# In ~/.bashrc
alias dirs="dirs -v"
    
por 17.03.2016 / 13:56
30

Um caso de uso simples para usar o dirs stack, o que você não pode fazer é apenas cd:

pushd . adiciona o diretório atual XX à dirs stack. Depois, você pode se movimentar usando cd e, para retornar a XX, você apenas faz popd , independentemente de quão "distante" esteja na árvore de diretórios (pode saltar vários níveis, lateralmente, etc.). Especialmente útil em scripts bash.

    
por 24.09.2015 / 19:41
8

pushd e popd permitem que você manipule os diretórios na pilha.

Quando você pushd um diretório, coloca o diretório atual na pilha e altera o diretório para o especificado como um parâmetro.

popd permitirá que você volte ao diretório na pilha.

Se você repetir, o caminho do diretório será preservado e você poderá voltar aos diretórios salvos em ordem inversa do que você salvou.

    
por 25.05.2013 / 19:47
5

Um uso prático que eu encontrei é alternar entre diretórios usando pushd e popd.

Suponha que temos dois diretórios dir1 e dir2 e eu preciso alternar entre eles continuamente por algum motivo xyz.

Atualmente, estou no somedir que possui dois diretórios dir1 e dir2 :

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

Agora mudo para dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

Agora adicionarei dir1 à pilha e alternarei para dir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

Como você pode ver, agora eu tenho dir2 e dir1 na pilha e atualmente estou em dir2 .

Agora, para voltar para dir1 , vou executar pushd || popd .

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Voila, estou na dir1 e tenho dir1 e dir2 na pilha. Para voltar para dir2, execute novamente pushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Esta é uma maneira simples de alternar entre diretórios. Agora, você poderia saber por que eu preciso alternar entre diretórios? Bem, um caso de uso é, quando eu trabalho em um aplicativo da web, tenho meu arquivo make em um diretório e meus arquivos de log em outro diretório. Muitas vezes, ao depurar o aplicativo, eu preciso alternar entre o diretório de log, para verificar os logs mais recentes e, em seguida, voltar para o diretório make, para fazer algumas alterações e construir o aplicativo.

    
por 04.08.2015 / 07:22
5

para bash , basicamente: em vez de usar cd, é possível usar pushd para alterar directorys, com o uso prático: o histórico de diretórios visitados é salvo (corretamente: empilhado) e pode-se alternar entre eles

pushd /home; pushd /var; pushd log

Para ver a pilha use dirs e para facilitar a navegação (para obter os números do uso de "pilha de entradas":

dirs -v

Saída:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

Agora, use esses números com cd e ~ , como:

cd ~1

Mas esses números são rearranjados agora e a posição "0" irá mudar, então apenas pushd do diretório para a posição de cima duas vezes (ou use um manequim na posição 0) como:

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

agora 1..3 manterá a posição

(para liberar o diretório atual da pilha / excluí-lo do histórico use popd )

    
por 16.12.2016 / 13:43
1

Eu achei o uso de dirs / popd / pushd um pouco desconfortável. Eu criei minha solução pessoal em tcsh, adicionando o seguinte código em .alias

  foreach b (. , - 0 1 2 3 4 5 6 7 8 9 )
    alias p$b       'set a='pwd'; echo $a >! ~/.mydir'$b
    alias cd$b      'cd "'cat ~/.mydir'$b''"'
    alias del$b     'rm -v ~/.mydir'$b
    alias home$b    'set a="~"; echo $a >! ~/.mydir'$b
  end
    alias cdl       'grep / ~/.mydir*'

desta forma eu alias, por exemplo, "p". para salvar o diretório atual em arquivo ~ / .mydir. e "cd". para recuperar esse dir quando e onde eu quiser. "del" remove o arquivo correspondente; "casa." define o dir para o diretório home (equivalente a cd; p.); "cdl" lista quais são os diretórios salvos. Observe que, se você usar ~ / Dropbox / .mydir $ b (ou qualquer outro serviço na nuvem como, por exemplo, ownCloud) em vez de ~ / .mydir $ b, terá uma maneira inteligente de usar seus diretórios preferidos em contas e computadores diferentes.

    
por 20.03.2017 / 13:57
0

I am using it like this in my bash_profile and .bashrc like this

vi .bash_profile
alias dirs="dirs -v"
source d.sh
:wq

vi .bashrc
alias dirs="dirs -v"
:wq

vi d.sh
pushd ~/Documents/GIT/seiso-data
pushd ~/Documents/GIT/ewe/EosRegistry
pushd ~/Documents/GIT_LODGING/site-cookbooks
pushd ~/Documents/CHEF_LODGING
pushd  .
:wq

me ajuda a saltar entre os diretórios para os mais recentes usados no meu terminal. :-) Espero que ajude você a usar o pushd ao invés do popd eu uso cd ~ stackednumber

    
por 07.04.2018 / 07:16