Как использовать команды pushd и popd?

Каковы практические применения как pushd, так и popd, когда есть преимущество использования этих двух команд над cd и cd -?

EDIT . Я ищу некоторые практические примеры использования для обеих этих команд или причины для хранения стека с каталогами (когда у вас есть завершение табуляции, cd - , псевдонимы для сокращения cd .. и т. д.).

241 голос | спросил syntagma 25 Maypm13 2013, 21:41:26

8 ответов


230

pushd , popd и dirs - это встроенные оболочки, которые позволяют вам манипулировать стек каталога . Это можно использовать для изменения каталогов, но вернуться в каталог, из которого вы пришли.

Например

запустите следующие каталоги:

$ ls
dir1 dir2 dir3

pushd to dir1

$ pushd dir1
~ /somedir /dir1 ~ /somedir
$ dirs
~ /somedir /dir1 ~ /somedir
Команда

dirs подтверждает, что теперь у нас есть 2 каталога в стеке. dir1 и исходный каталог, somedir.

pushd to ../dir3 (потому что мы внутри dir1)

$ pushd ../dir3
~ /somedir /dir3 ~ /somedir /dir1 ~ /somedir
$ dirs
~ /somedir /dir3 ~ /somedir /dir1 ~ /somedir
$ pwd
/Главная /SAML /somedir /dir3

dirs показывает, что теперь у нас есть 3 каталога в стеке. dir3, dir1 и somedir. Обратите внимание на направление. Каждый новый каталог добавляется слева. Когда мы начнем выкладывать каталоги, они также будут левее.

вручную смените каталоги на ../dir2

$ cd ../dir2
$ pwd
/Главная /SAML /somedir /dir2

Теперь начните поиск каталогов

$ popd
~ /somedir /dir1 ~ /somedir
$ pwd
/Главная /SAML /somedir /dir1

Обратите внимание, что мы вернулись к dir1.

Повторить снова ...

$ popd
~ /Somedir
$ pwd
/Главная /SAML /somedir

И мы вернулись туда, где мы начали, somedir.

Может показаться немного запутанным, но глава стека - это каталог, в котором вы сейчас находитесь. Поэтому, когда мы возвращаемся к somedir, даже если dirs показывает это:

$ dirs
~ /Somedir

Наш стек infact empty.

$ popd
bash: popd: каталог стека пуст
ответил slm 25 Maypm13 2013, 22:05:24
131

Для работы с несколькими папками существует полезный прецедент для команд pushd и popd .

Вы можете легко перемещаться по стеку, поскольку он перечисляется. Значит, во время работы у вас может быть несколько рабочих папок.

См. простой пример ниже.


Сначала давайте создадим структуру папок примера.

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

Затем вы можете добавить все папки в стек:

user @ vb: ~ /navigate $ pushd dir1 /
    ~ /navigate /dir1 ~ /navigate
    user @ vb: ~ /navigate /dir1 $ pushd ../dir2/
    ~ /navigate /dir2 ~ /navigate /dir1 ~ /перейти
    user @ vb: ~ /navigate /dir2 $ pushd ../dir3/
    ~ /navigate /dir3 ~ /navigate /dir2 ~ /navigate /dir1 ~ /перейти

Вы можете посмотреть его:

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

Чтобы безопасно перемещаться, вам нужно дважды добавить последнюю (ноль) папку, так как она будет всегда перезаписана:

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

Теперь вы можете перемещаться по этим папкам и работать со стеком, как с псевдонимами для папок. Я предполагаю, что следующая часть объясняет себя:

user @ vb: ~ /navigate /dir3 $ cd ~ 4
    user @ vb: ~ /navigate $ dirs -v
     0 ~ /перейти
     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

Дополнительный совет - создать некоторый псевдоним для dirs -v.

Например:

# В ~ /.bashrc
alias dirs = "dirs -v"
ответил Jun Murakami 17 MarpmThu, 17 Mar 2016 15:56:55 +03002016-03-17T15:56:55+03:0003 2016, 15:56:55
26

Один простой пример использования dirs stack, который вы не можете сделать, просто cd:

pushd. добавляет текущий каталог XX в стек dirs. Впоследствии вы можете перемещаться с помощью cd, а для возврата в XX вы просто выполняете popd, независимо от того, как «далеко» вы находитесь в дереве каталогов (можете перепрыгивать через несколько уровни, боком и т. д.). Особенно полезно в сценариях bash.

ответил P.M 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 24 Sep 2015 20:41:07 +0300 2015, 20:41:07
8

pushd и popd позволяют управлять каталогами в стеке.

Когда вы pushd каталог, вы помещаете текущий каталог в стек и меняете каталог на тот, который указан как параметр.

popd позволит вам вернуться в каталог в стеке.

Если вы повторите, обход каталога будет сохранен, и вы можете вернуться к сохраненным каталогам в обратном порядке из того, что вы их сохранили.

ответил unxnut 25 Maypm13 2013, 21:47:22
5

Одно практическое применение, которое я нашел, - это переключение между каталогами с помощью pushd и popd.

Предположим, что у нас есть два каталога dir1 и dir2, и мне нужно постоянно переключаться между ними для некоторой причины xyz.

В настоящее время я в somedir, который имеет два каталога dir1 и dir2:

алкоголь @ алкоголь-машина: ~ /somedir $ ls
dir1 dir2
алкоголь @ алкоголь машина: ~ /somedir $

Теперь я переключаюсь на dir1

алкоголь @ алкоголь-машина: ~ /somedir $ cd dir1
алкоголь @ алкоголь-машина: ~ /somedir /dir1 $ pwd
/Главная /алкоголь /somedir /dir1

Теперь я добавлю dir1 в стек и переключитесь на dir2

алкоголь @ алкоголь-машина: ~ /somedir /dir1 $ pushd /home /алкоголь /somedir /dir2
~ /somedir /dir2 ~ /somedir /dir1
алкоголь @ алкоголь машина: ~ /somedir /dir2 $

Как вы можете видеть, теперь у меня есть dir2 и dir1 в стеке, и теперь я вхожу в dir2.

Теперь, чтобы вернуться к dir1, я запустил pushd || POPD.

алкоголь @ алкоголь-машина: ~ /somedir /dir2 $ pushd || POPD
~ /somedir /dir1 ~ /somedir /dir2
алкоголь @ алкоголь машина: ~ /somedir /dir1 $

Воила, я в dir1, и у меня есть dir1 и dir2 на стеке. Чтобы снова вернуться к dir2, запустите pushd || POPD

алкоголь @ алкоголь-машина: ~ /somedir /dir2 $ pushd || POPD
~ /somedir /dir1 ~ /somedir /dir2
алкоголь @ алкоголь машина: ~ /somedir /dir1 $

Это простой способ переключения между каталогами. Теперь вы можете узнать, почему мне нужно переключаться между каталогами? Ну, один случай использования, когда я работаю над веб-приложением, у меня есть мой файл make в одном каталоге и мои файлы журналов в другом каталоге. Часто при отладке приложения мне нужно переключиться между каталогом журналов, проверить последние журналы и затем вернуться в каталог make, внести некоторые изменения и создать приложение.

ответил Varun Risbud 4 AM00000080000001431 2015, 08:22:14
5

для bash , в основном: вместо использования cd можно использовать pushd для изменения каталогов, с практическим использованием: история посещенных каталогов сохраняется (правильно: сложена ) и можно переключаться между ними

pushd /home; pushd /var; pushd log

Чтобы увидеть, как стек использует dirs и для упрощения навигации (для получения номеров «записей стека» используйте:

dirs -v

Вывод:

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

Теперь используйте эти цифры с помощью cd и ~, например:

cd ~ 1

Но эти цифры теперь перегруппированы, и позиция «0» изменится, поэтому просто pushd каталог в верхнее положение дважды (или используйте фиктивный элемент в позиции 0), например:

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

теперь 1..3 сохранит там положение

(чтобы освободить текущий каталог из стека /удалить его из истории, используйте popd)

ответил eli 16 FriEurope/Moscow2016-12-16T15:43:37+03:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2016 15:43:37 +0300 2016, 15:43:37
1

Я нашел, что использование dirs /popd /pushd немного неудобно. Я придумал свое личное решение в tcsh, добавив следующий код в .alias

foreach b (., - 0 1 2 3 4 5 6 7 8 9)
    псевдоним p $ b 'set a = `pwd`; echo $ a & gt ;! ~ /.mydir '$ б
    alias cd $ b 'cd "` cat ~ /.mydir' $ b'` "'
    alias del $ b 'rm -v ~ /.mydir' $ b
    alias home $ b 'set a = "~"; echo $ a & gt ;! ~ /.mydir '$ б
  конец
    alias cdl 'grep /~ /.mydir *'

таким образом, я, например, использовал псевдоним "p." для сохранения текущего рабочего каталога в файл ~ /.mydir. и "cd." чтобы восстановить этот каталог, когда и где мне нравится. «Дель». удаляет соответствующий файл; "Главная." устанавливает каталог в домашний каталог (эквивалент cd; p.); «cdl» перечисляет, какие сохраненные каналы. Обратите внимание, что если вы используете ~ /Dropbox /.mydir $ b (или любые другие облачные сервисы, например, ownCloud) вместо ~ /.mydir $ b, вы получите умный способ использовать ваши предпочитаемые каналы на разных учетных записях и машинах.

ответил Vitelot 20 MarpmMon, 20 Mar 2017 15:57:54 +03002017-03-20T15:57:54+03:0003 2017, 15:57:54
0
  

Я использую его вот так в bash_profile и .bashrc как это

vi .bash_profile
alias dirs = "dirs -v"
источник 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 /сайт-поваренные книги
pushd ~ /Documents /CHEF_LODGING
толчок.
: WQ

, это помогает мне переходить между каталогами к последним, используемым на моем терминале. :-) Надеюсь, что это поможет вам использовать pushd, а также popd, я использую cd ~ stackednumber

ответил Ankur Jain 7 AMpSat, 07 Apr 2018 08:16:12 +030016Saturday 2018, 08:16:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132