Как я использую команды popd и pushd?

Вы могли использовать Параллель GNU вместо этого:

$ echo "/Place/='http://www.google.com'" | parallel echo
/Place/='http://www.google.com'

Затем Вы не должны делать заключения в кавычки себя.

Подробнее: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1

351
09.07.2013, 02:41
10 ответов

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

Например,

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

$ ls
dir1  dir2  dir3

pushd к dir1

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

dirs команда подтверждает, что у нас есть 2 каталога на стеке теперь. dir1 и исходный dir, somedir.Примечание: Наш "текущий" каталог ~/somedir/dir1.

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

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

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

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

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

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

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

Заметьте, что мы появились назад к dir1.

Появитесь снова...

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

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

Мог бы стать немного сбивающим с толку, но глава стека является каталогом, в котором Вы в настоящее время находитесь. Следовательно, когда мы возвращаемся к somedir, даже при том, что dirs шоу это:

$ dirs
~/somedir

Наш стек на самом деле пуст.

$ popd
bash: popd: directory stack empty
322
27.01.2020, 19:26
  • 1
    Спасибо, я полностью понимаю понятие стека и как это управляет работой. Однако я ищу некоторые практические причины хранения стека с каталогами (когда у Вас есть заполнение клавишей Tab, cd -, псевдонимы для сокращения cd .., и т.д.). –  syntagma 25.05.2013, 21:26
  • 2
    я часто использую pushd & popd в сценариях b/c они сохраняют меня от необходимости помнить, куда я происходил из, я могу всегда просто popd возвращаться из того, куда я приехал. Я обычно делаю popd >/dev/null 2>&1 сделать это тихим. Я использую CD - каждый день в моей оболочке. Существуют некоторые другие экономящие время подсказки в этой статье также: thegeekstuff.com/2008/10 / …. –  slm♦ 25.05.2013, 21:31
  • 3
    @Garrett - ни один, что я могу задумать. –  slm♦ 22.08.2014, 04:11
  • 4
    @Garrett @slm с тех пор cd - только отслеживает последний каталог, я предполагаю, что было бы возможно иметь проблемы, если Вы вызываете функцию, которая также изменяет каталог внутренне. в этом случае функция закончила бы тем, что сбросила - к Вашему текущему каталогу, не каталогу, к которому Вы хотите появиться назад. pushd/popd является самым безопасным методом.Примечание: я не протестировал свою теорию. –  Binary Phile 10.11.2014, 22:52
  • 5
    Почему не возвращение к ~/somedir/dir3 после первого popd? –  ziyuang 19.02.2016, 00:03

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

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

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

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

10
27.01.2020, 19:26

Один простой случай использования стека dirs, который нельзя сделать с помощью простого cd:

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

42
27.01.2020, 19:26

Существует действительно полезный вариант использования команд 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 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

Вы можете найти его по:

    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  ~/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

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

Например:

# In ~/.bashrc
alias dirs="dirs -v"
208
27.01.2020, 19:26

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

pushd /home; pushd /var; pushd log

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

dirs -v

Вывод:

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

Теперь используйте эти числа с cd и ~ , например:

cd ~1

Но теперь эти числа переставлены, и позиция "0" изменится, поэтому просто дважды переместите каталог в верхнюю позицию (или используйте пустышку в позиции 0), например:

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

теперь 1..3 сохранит там позиция

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

8
27.01.2020, 19:26

Я нашел использование dirs/popd/pushd немного неудобным. Я придумал свое личное решение в tcsh, добавив следующий код в .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*'

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

6
27.01.2020, 19:26

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

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

3
27.01.2020, 19:26

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

Так, например, вместо того, чтобы заново -придумывать предыдущие длинные пути, просматривая историю своего буфера или вкладку -завершая длинный путь, вы просто складываете важные пути и, при необходимости, удобно перемещаете их. им только по их числу. Переключение между сложными структурами каталогов и длинными путями становится плавным и быстрым.

Встроенные функции также позволяют вам -переупорядочивать стек или извлекать каталоги, которые вам больше не нужны, что обеспечивает гибкость рабочего процесса.

Укладка каталогов также может использоваться в сценариях аналогичным образом для операций, охватывающих несколько каталогов.

6
27.01.2020, 19:26

Использование cdи cd -позволяет переключаться только между двумя последними использованными каталогами. Размер вашего «рабочего набора каталогов» равен двум.

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

В большинстве случаев я использую pushd, а не cd. После того, как вы создали стек активных каталогов с помощью pushd directory_name, вы можете прыгать между ними весь день с помощью 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.

Я использую popdредко, только когда я хочу удалить каталог из стека, когда я знаю, что я закончил использовать этот каталог.

Перейти в каталог и удалить его из стека:

popd ~2

Остаться в текущем каталоге и удалить другой каталог из стека:

popd +2

Вы получаете рабочий стиль, похожий на открытие нескольких окон или вкладок терминала (по одному для каждого каталога, в котором вы активно работаете ), но все в одном терминале. Это экономит место на экране, плюс, поскольку все пути к каталогам доступны в одной оболочке, вы можете делать такие вещи, как:

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

Примеры:

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

В tcsh(, но не в bash), вы даже можете сохранить свой стек каталогов в файл и восстановить его позже.

Сохранить:

dirs -S ~/dirstack

Восстановить:

dirs -L ~/dirstack

В противном случае просто замените ~в примерах bashна =для использования в tcsh.

pushd =2
popd =4
popd +1
5
27.01.2020, 19:26

Pushd/popd — это такая простая концепция, что мне потребовалось некоторое время, чтобы ее понять, поскольку люди склонны обучать ее, определяя эти команды как команды, которые «манипулируют стеком каталогов», что, на мой взгляд, очень запутанно.

Я смотрю на это по-другому:

pushd [имя папки _]-перейдет в [имя папки _] и будет документировать место назначения, которое является [имя папки _] в каталоге -куча. В то время как верхний каталог в стеке всегда будет текущим каталогом, в котором вы находитесь.

popd-будет cd в запись каталога , которая задокументирована в верхней части стека, а затем удалит документацию (из стека каталога -).

dirs-Напечатает dir -stack (, который можно рассматривать как dir Db, где самая левая запись является текущим каталогом (вершиной стека ).

Итак, 2 самых популярных варианта использования::

Вариант использования 1:Навигация с использованием pushd и 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

Я сделал это, потому что хотел вернуться к задокументированным папкам! (используя popd, вместо того, чтобы вводить относительный или абсолютный путь к каждому каталогу, я хочу вернуться в ).

Обратите внимание, что если я вручную cd, я повлияю на верхний элемент стека каталога (, который всегда является текущим каталогом)

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$ 

Теперь вернемся назад:

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

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

Вариант использования 2:Навигация с использованием числового индекса стека

Допустим, я отправил pushd dir4 dir3 dir2 dir1,теперь запущенный каталог -v покажет:

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

Теперь вы можете выполнять любые операции Linux, в которых задействованы каталоги, используя индекс стека:

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

Вы даже можете удалить определенную запись из стека каталогов -:

root@mypc:/main$ popd ~4

Надеюсь, что использование слов "документирование" или представление о стеке dir -как о своего рода Db упрощает концепцию!

10
27.01.2020, 19:26

Теги

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