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
/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
cd -
, псевдонимы для сокращенияcd ..
и т. Д.).pushd
&popd
в сценариях, потому что они избавляют меня от необходимости помнить, откуда я пришел, я всегда могу простоpopd
вернуться туда, откуда пришел. Я обычно делаю,popd >/dev/null 2>&1
чтобы заставить его замолчать. Я использую CD- каждый день в моей оболочке. В этой статье есть и другие советы по экономии времени: thegeekstuff.com/2008/10/… .cd -
отслеживает только последний каталог, я думаю, что могут возникнуть проблемы, если вы вызовете функцию, которая также меняет каталог внутри. в этом случае функция перестанет сбрасываться - в ваш текущий каталог, а не в каталог, в который вы хотите вернуться. pushd / popd - самый безопасный метод. Примечание: я не проверял свою теорию.~/somedir/dir3
после первогоpopd
?Существует очень полезный вариант использования
pushd
иpopd
команд для работы с несколькими папками одновременно.Вы можете перемещаться по стеку очень легко, так как он перечисляется. Это означает, что вы можете иметь несколько рабочих папок в вашем распоряжении во время работы.
Смотрите простой пример ниже.
Сначала давайте создадим пример структуры папок.
Затем вы можете добавить все свои папки в стек:
Вы можете посмотреть это:
Для безопасной навигации вам нужно добавить последнюю (нулевую) папку дважды, так как она всегда будет переписана:
Теперь вы можете перемещаться по этим папкам и работать со стеком, как с псевдонимами для папок. Я думаю, что следующая часть говорит сама за себя:
Дополнительный совет - создать псевдоним для
dirs -v
.Например:
источник
dirs -c
Один простой пример использования стека dirs, который вы не можете сделать просто cd:
pushd .
добавляет текущий каталог XX вdirs
стек. После этого вы можете перемещаться с помощьюcd
, а чтобы вернуться к XX, вы просто делаете этоpopd
независимо от того, насколько «далеко» вы находитесь в дереве каталогов (можете перепрыгивать через несколько уровней, в стороны и т. Д.). Особенно полезно в скриптах bash.источник
pushd
/popd
работать независимо отcd
, вы можете использовать их в качестве более стабильной закладки, чемcd -
.pushd
иpopd
позволяют вам манипулировать каталогами в стеке.Когда вы
pushd
каталог, вы помещаете текущий каталог в стек и меняете каталог на каталог, указанный в качестве параметра.popd
позволит вам вернуться в каталог в стеке.Если вы повторитесь, обратный путь в каталогах будет сохранен, и вы сможете вернуться в сохраненные каталоги в порядке, обратном тому, в котором вы их сохранили.
источник
для bash , в основном: вместо использования cd можно использовать
pushd
для изменения каталогов, с практическим использованием: история посещенных каталогов сохраняется (правильно: сложено) и можно переключаться между нимиЧтобы увидеть использование стека
dirs
и для более удобной навигации (чтобы получить номера «записей стека», используйте:Выход:
Теперь используйте эти числа с
cd
и~
как:Но эти числа теперь переставлены, и позиция «0» изменится, поэтому просто
pushd
поместите каталог в верхнюю позицию дважды (или используйте пустышку в позиции 0), например:Теперь 1..3 сохранит там свои позиции
(чтобы освободить текущий каталог из стека / удалить его из истории использования
popd
)источник
Одно практическое применение, которое я нашел, - переключение между каталогами с помощью pushd и popd.
Предположим, у нас есть два каталога dir1 и dir2, и мне нужно постоянно переключаться между ними по какой-то причине xyz.
В настоящее время я нахожусь в Somedir, который имеет две директории
dir1
иdir2
:Теперь я переключаюсь на
dir1
Теперь я добавлю
dir1
в стек и переключусь наdir2
Как вы видите, у меня сейчас есть
dir2
иdir1
в стеке, и я в настоящее время вdir2
.Теперь, чтобы переключиться обратно
dir1
, я побегуpushd || popd
.Вуаля, я в dir1 и у меня есть dir1 и dir2 в стеке. Чтобы снова переключиться на dir2, запустите
pushd || popd
Это простой способ переключения между каталогами. Теперь вы можете что знать, зачем мне переключаться между каталогами? Один из вариантов использования: когда я работаю над веб-приложением, мой make-файл находится в одном каталоге, а мои файлы журналов - в другом. Часто при отладке приложения мне нужно переключаться между каталогами журналов, проверять последние журналы и затем переключаться обратно в каталог make, чтобы внести некоторые изменения и собрать приложение.
источник
pushd
иpopd
болееcd -
?» Вы явно не ответили на этот вопрос, так как вы описываете именно то, чтоcd -
делает. (2) Какой смысл говоритьpushd || popd
? Да, я знаю, чтоcmdA || cmdB
значит «бежать»cmdA
и, если не получится, запуститьcmdB
. Я спрашиваю, что хорошего в этом контексте.pushd
без аргументов означает «поменять два верхних элемента в стеке каталогов»; это терпит неудачу, если текущий каталог является единственным элементом в стеке каталогов. В этом случаеpopd
также не удастся.pushd
иpopd
.pushd || popd
для переключения между каталогами:pushd
без аргументов делает это.cd -
явно существует исключительно для переключения обратно в последний каталог. Кроме того, вопрос задал преимуществоpushd
более чемcd -
, в то время как этот ответ явно предоставляет только недостаток: больше печатания.|| popd
переключение? Пожалуйста, объясни. (Разве не достаточно толка?)cd -
для переключения между двумя каталогами. Дополнительноcd
без аргументов возвращается в ваш домашний каталог.Проще говоря - когда вам нужно перемещаться между более чем 2 каталогами, обычно несколько раз назад и вперед,
cd -
просто не обрезается ни с чем, кроме двух папок.Так, например, вместо того, чтобы пытаться пересмотреть предыдущие длинные пути, просматривая историю вашего буфера или заканчивая длинный путь табуляции, вы просто складываете важные из них, и, если необходимо, вы удобно переходите к ним только по их количеству. Вращение между сложными структурами каталогов и длинными путями становится скользким и быстрым.
Встроенные функции также позволяют вам переупорядочивать стек или извлекать каталоги, которые вам больше не нужны, обеспечивая гибкость в вашем рабочем процессе.
Укладка каталогов также может использоваться в сценариях аналогично для операций, которые охватывают несколько каталогов.
источник
Я нашел использование dirs / popd / pushd немного неудобным. Я придумал свое личное решение в tcsh, добавив следующий код в .alias
таким образом, я псевдоним, например, "р." сохранить текущий рабочий каталог в файл ~ / .mydir. и "компакт-диск" чтобы восстановить этот каталог, когда и где мне нравится. «Дель». удаляет соответствующий файл; "Главная." устанавливает dir в домашний каталог (эквивалентный cd; p.); "cdl" перечисляет, что является сохраненными каталогами. Обратите внимание, что если вы используете ~ / Dropbox / .mydir $ b (или любой другой облачный сервис, например, ownCloud) вместо ~ / .mydir $ b, вы получите умный способ использования предпочитаемых вами каталогов для разных учетных записей и машин.
источник
это помогает мне переключаться между каталогами на самые последние используемые на моем терминале. :-) Надеюсь, это поможет вам использовать pushd, а не popd, я использую cd ~ stackednumber
источник
Использование
cd
иcd -
позволяет вам переключаться только между двумя вашими последними использованными каталогами. Размер вашего "рабочего каталога" равен двум.Используя
pushd
, вы можете хранить произвольно большое количество каталогов в вашем рабочем наборе.Я использую
pushd
большую часть времени, а неcd
. После того, как вы создали стек активных каталоговpushd directory_name
, вы можете переходить между ними весь деньpushd ~#
.Я использую
popd
редко, только когда я хочу удалить каталог из стека, когда я знаю, что я использую этот каталог.Перейдите в каталог и удалите его из стека:
Оставайтесь в текущем каталоге и удалите другой каталог из стека:
Вы получаете рабочий стиль, который похож на открытие нескольких окон или вкладок терминала (по одному для каждого каталога, в котором вы активно работаете), но все в одном терминале. Это экономит пространство экрана, плюс, поскольку все пути к каталогам доступны в одной оболочке, вы можете делать такие вещи, как:
Примеры:
В
tcsh
(но неbash
), вы даже можете сохранить свой стек каталогов в файл и восстановить его позже.Сохранить:
Восстановить:
В противном случае просто замените
~
вbash
примерах=
на использование вtcsh
.источник
Pushd / popd - это такая простая концепция, которую мне потребовалось некоторое время, чтобы понять, так как люди склонны учить ее, определяя эти команды как команды, которые «манипулируют стеком каталогов», что, на мой взгляд, сбивает с толку.
Я смотрю на это по-другому:
pushd [имя_папки] - перейдет на [имя_папки] и задокументирует пункт назначения, который является [имя_папки] в стеке каталогов, в то время как верхний каталог в стеке всегда будет текущим каталогом, в котором вы находитесь.
popd - сначала перейдет в директорию записи, которая находится на вершине стека, а затем удалит ее из стека.
dirs - будет печатать стек dir (может рассматриваться как dir Db, где самая левая запись - это текущий каталог (вершина стека)
Итак, 2 самых популярных варианта использования:
Вариант использования 1: навигация с использованием pushd и popd
Допустим, я сделал выше, так как я хотел бы вернуться к тем папкам, которые я задокументировал!
Обратите внимание, что если я вручную cd, я буду влиять на запись верхнего стека dir (который всегда является текущим dir)
Давайте теперь перейдем назад:
Опять же, я могу задокументировать любой каталог, который я хочу, и затем вручную перейти к другому каталогу, после чего я смогу легко вернуться к документированному каталогу, который я вставил в стек.
Вариант использования 2: навигация с использованием числового индекса стека
Допустим, я нажал, используя pushd dir4 dir3 dir2 dir1, теперь запуск dir -v покажет:
Теперь вы можете выполнить любую операцию Linux, которая включает каталоги, используя индекс стека:
Вы даже можете удалить конкретную запись из стека каталогов:
Надеюсь, что использование слов «документирование» или представление о стеке dir как о некотором Db упрощает эту концепцию!
источник