Como uso os comandos pushd e popd?

Quais são os usos práticos de 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 ambos os comandos ou razões para manter a pilha com diretórios (quando você conclui tabulação, cd -, aliases para abreviar cd .., etc.).

Resposta

pushd , popd , e dirs são shell builtins que permitem que você manipule a pilha de diretórios . Isso pode ser usado para alterar diretórios, mas retornar ao diretório de onde veio.

Por exemplo

inicialize com os seguintes diretórios:

$ pwd /home/saml/somedir $ ls dir1 dir2 dir3 

pushd para dir1

$ pushd dir1 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir1 ~/somedir 

dirs O comando confirma que temos 2 diretórios na pilha agora. dir1 e o diretório original, somedir. NOTA: Nosso ” ” o diretório é ~/somedir/dir1.

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. Cada novo diretório está sendo adicionado à esquerda. Quando começamos a abri-los desativados, eles “virão da esquerda também.

altere manualmente os diretórios para ../dir2

$ cd ../dir2 $ pwd /home/saml/somedir/dir2 $ dirs ~/somedir/dir2 ~/somedir/dir1 ~/somedir 

Agora comece a abrir 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 estamos de volta ao ponto de partida, somedir.

Pode ficar um pouco confuso, mas o chefe do stac k é o diretório em que você está. Portanto, quando voltarmos para somedir, embora dirs mostre isso:

$ dirs ~/somedir 

Nossa pilha está, na verdade, vazia.

$ popd bash: popd: directory stack empty 

Comentários

  • Obrigado, eu entendo totalmente o conceito de pilha e como esses comandos funcionam. No entanto, eu ‘ estou procurando algumas razões práticas para manter a pilha com diretórios (quando você tiver preenchimento de tabulação, cd -, apelidos para encurtamento div id = “e670ea3339”>

, etc.).

  • Costumo usar pushd & popd em scripts b / c eles me salvam de ter que lembrar de onde eu estava vindo, sempre posso apenas popd voltar de onde eu vim. Normalmente faço popd >/dev/null 2>&1 para torná-lo silencioso. Eu uso cd- todos os dias no meu shell. Existem algumas outras dicas para economizar tempo neste artigo: thegeekstuff.com/2008/10/… .
  • @Garrett – nenhum que eu possa conceber.
  • @Garrett @slm já que cd - rastreia apenas o último diretório, imagino que sim será possível ter problemas se você chamar uma função que também muda de diretório internamente. nesse caso, a função acabaria sendo redefinida – para o diretório atual, não para o diretório para o qual deseja voltar. pushd / popd é o método mais seguro. Observação: eu não ‘ t testei minha teoria.
  • Por que não voltando para ~/somedir/dir3 após o primeiro popd?
  • Resposta

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

    Você pode navegar na pilha muito facilmente, uma vez que é 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 navegar por essas pastas e trabalhar com empilhar como com aliases para as pastas.Acho que a parte a seguir é autoexplicativa:

     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 algum alias para dirs -v.

    Por exemplo:

    # In ~/.bashrc alias dirs="dirs -v" 

    Comentários

    • E você pode limpar a pilha dirs -c
    • +1 para dando alguns exemplos práticos. É ‘ fácil ver o que pushd / popd faz na página de manual, mas dirs e cd ~ # não são óbvios no início.
    • você também pode usar uma solução como fasd para este tipo de fluxo de trabalho, embora
    • @Jun, haja ‘ s ” mkdir dir {1,2,3} ” para criar 3 diretórios de uma vez.
    • @JunMurakami isso fez o meu ano! Feliz 2020!

    Resposta

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

    pushd . adiciona o diretório atual XX à pilha dirs. Depois, você pode mover-se usando cd e, para retornar ao XX, basta fazer popd independentemente de quão “longe” você está a árvore de diretórios (pode pular vários níveis, para os lados, etc.). Especialmente útil em scripts bash.

    Comentários

    • Acho que esse é o recurso que utilizo com mais frequência. Como pushd / popd trabalha independente de cd, você pode usá-los como um favorito do que cd -.
    • para mim, isso não é verdade. Toda vez que eu uso cd, minha pilha muda.
    • ah, isso era porque eu usava zsh, quando eu mudo para o bash, funciona bem
    • Esta é a única resposta substantiva em relação a uma comparação com cd -, IMO. Quanto a se pushd foo; < alteração de diretório aleatório >; popd vale mais a pena do que a = foo; cd $ a; < alteração de diretório aleatório >; cd $ a … Para scripts, posso ver uma pequena conveniência sintática no primeiro (pushd), mas uma grande melhoria na clareza no último (variáveis [explícitas]!). Para uma sessão interativa, acho que presumiria que minha hierarquia de diretórios estava organizada corretamente em primeiro lugar, e se eu me perdesse simplesmente cd ~ / back / to / binary / path.
    • @HarendraSingh, você não ‘ não está AUTO_PUSHD definido? Isso fará com que cd se comporte como pushd, desative-o e você ‘ voltará a ” comportamento normal “.

    Resposta

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

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

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

    Se você repetir, a travessia do diretório será preservada e você poderá voltar aos diretórios salvos na ordem inversa em que os salvou.

    Resposta

    Para bash , basicamente: em vez de usar cd, pode-se use pushd para alterar os diretórios. Com uso prático: o histórico dos 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 uma navegação mais fácil (para obter os números das ” entradas da pilha ” use:

    dirs -v 

    Resultado:

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

    Agora utilize esses números com cd e ~ como:

    cd ~1 

    Mas esses números estão reorganizados agora e posicionam ” 0 ” mudará, então apenas pushd o diretório para a posição superior 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á sua posição

    (Para liberar o diretório atual de a pilha / excluindo-o do histórico, use popd)

    Resposta

    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 “, o que, na minha opinião, é muito confuso.

    Eu vejo isso de uma maneira diferente:

    pushd [folder_name] – fará o cd para [nome_da_pasta] e documentará o destino que é [nome_da_pasta] em uma pilha dir enquanto o diretório superior na pilha será sempre o diretório atual em que você está

    popd – irá primeiro colocá-lo no cd o registro do diretório que está no topo da pilha e remova a documentação (remova-o da pilha dir)

    dirs – Irá imprimir a pilha dir (pode ser tratada como dir Db, onde a entrada mais à esquerda é o diretório atual (topo 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 Eu fiz o acima, pois gostaria de navegar de volta para as pastas que documentei!

    Observe que se eu fizer o CD manualmente, afetarei a entrada da pilha de diretório 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 quiser 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 numérico da pilha

    Digamos que eu empurrei 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 fazer qualquer operação Linux que envolva diretórios usando o índice de 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é mesmo deletar um específico entrada da pilha dir:

    root@mypc:/main$ popd ~4 

    Espero que usar as palavras “documentar” ou pense na pilha dir como algum tipo de Db simplifique o conceito!

    Resposta

    Simplificando – quando você precisa navegar entre mais de 2 diretórios, geralmente várias vezes para trás & adiante, pois cd - simplesmente não vai “cortá-lo com nada além de 2 pastas.

    Então, por exemplo, em vez de tentar voltar com longos caminhos anteriores, olhando para o histórico do seu buffer ou completando um longo caminho com tabulação, você simplesmente empilhou os importantes e, se necessário, você convenientemente move-se até eles apenas pelo número. A rotação entre estruturas de diretórios complexas e caminhos longos torna-se mais fácil e rápida.

    Os recursos embutidos também permitem reordenar a pilha ou abrir os diretórios de que não precisa mais, permitindo flexibilidade em seu fluxo de trabalho.

    O empilhamento de diretórios também pode ser usado em scripts de maneira semelhante para operações que abrangem vários diretórios.

    Resposta

    I achei o uso de dirs / popd / pushd um pouco desconfortável. Eu vim com 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 aliasei, por exemplo, “p.” para salvar o diretório de trabalho atual no arquivo ~ / .mydir. e “cd.” para recuperar esse diretório quando e onde eu quiser. “del.” remove o arquivo correspondente; “home.” define o diretório como 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 de nuvem como por exemplo, ownCloud) em vez de ~ / .mydir $ b, você obtém uma maneira inteligente para usar seus diretórios preferidos em diferentes contas e máquinas.

    Resposta

    Usando cd e cd - permite que você alterne apenas entre os dois diretórios usados mais recentemente. O tamanho do seu “conjunto de trabalho de diretório” é dois.

    Usando pushd, você pode manter um número arbitrariamente grande de diretórios em seu conjunto de trabalho.

    Eu uso pushd na maioria das vezes, em vez de cd. Depois de criar uma pilha de diretórios ativos com pushd directory_name, você pode pular entre eles o dia todo com pushd ~#.

    pushd dir1 pushd ../dir2 pushd /full/path/to/dir3 # There are now three directories in the stack. pushd ~3 pushd ~2 # The same three directories are still on the stack, # just in a different order. 

    Eu uso popd raramente, apenas quando quero remover um diretório da pilha quando sei que terminei usando esse diretório.

    Vá para o diretório e remova-o da pilha:

    popd ~2 

    Permaneça no diretório atual e remova outro diretório do pilha:

    popd +2 

    Você acaba com um estilo de trabalho que é semelhante a ter várias janelas de terminal ou guias abertas (uma para cada diretório em que você está ativamente funcionando), mas tudo em um terminal.Isso economiza o estado real da tela e, como os caminhos de diretório estão todos disponíveis em um shell, você pode fazer coisas como:

    • copiar arquivos entre os diretórios com os quais está trabalhando atualmente
    • visualizar ou editar arquivos em outro diretório sem ir até lá

    Exemplos:

    cp ~2/myfile.txt ~4 less ~2/myfile.txt 

    Em tcsh (mas não bash), você pode até salvar sua pilha de diretório em um arquivo e restaurá-la mais tarde.

    Salvar:

    dirs -S ~/dirstack 

    Restaurar:

    dirs -L ~/dirstack 

    Caso contrário, basta substituir ~ nos bash exemplos com = para uso em tcsh.

    pushd =2 popd =4 popd +1 

    Resposta

    Estou usando assim em meu bash_profile e .bashrc assim

    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 

    ajuda me pular entre os diretórios para o mais recente usado no meu terminal. 🙂 Espero que ajude você a usar pushd em vez de popd eu uso cd ~ stackednumber

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *