Использование popd без удаления последнего значения

8

Как я могу получить поведение использования, popdне выталкивая последний каталог из стека? Другими словами, я хочу вернуться к последнему каталогу, с которым я установил pushd, но я хочу, чтобы он оставался на вершине стека, чтобы следующий popdперенес меня в тот же каталог (который все еще был бы на вершине снова)

Freedom_Ben
источник
Не будет "CD -" работать? Если я понимаю, последовательность такова: «pushd d1; pushd d2; pushd d3;» и теперь, чтобы вернуться к d2, верно?
tpb261
cd -работает, но только если вы больше cdнигде, пока не будете готовы popd. Я обычно прыгаю в нескольких местах, прежде чем я готов вернуться
Freedom_Ben
Это очевидно ... но почему-то я пропустил неявную часть вашего вопроса.
tpb261

Ответы:

2

Как насчет: cd "$(dirs -l -p | sed -n '2{p;q}')"

Гленн Джекман
источник
Круто, спасибо! Это какая-то болтовня, если я когда-либо видел это. Я назначил эту команду псевдониму (что-то peekdвроде C ++ STL и легко запоминается), так что я могу просто напечатать, peekdчтобы получить поведение. alias peekd='cd "$(dirs -l -p | sed -n '\''2{p;q}'\'')"'
Freedom_Ben
3
@Freedom_Ben Это можно упростить доcd "$(dirs +1)"
Жиль "ТАК - перестань быть злым"
@Gilles Когда я пытаюсь это сделать, он говорит: «bash: cd <мой каталог>: такого файла или каталога нет», хотя он явно существует. Вы знаете, почему это так? Cd неправильно интерпретирует <мой каталог> как путь? Из сообщения об ошибке похоже, что оно должно работать. то есть, <мой каталог> выглядит правильно, и если я просто наберу "cd <мой каталог>", это работает.
nukeguy
1
@nukeguy <my directory>начинается с тильды? Мой комментарий выше пропускал -lвозможность перечислить полный каталог, а не использовать ~сокращение. Это должно бытьcd "(dirs -l +1)"
Жиль "ТАК - перестать быть злым"
@ Жиль Да! Это именно то, что я искал, спасибо! Возможно, вам следует опубликовать свой комментарий как отдельное решение - на мой взгляд, это самый общий и полезный вариант в этой теме.
nukeguy
10

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

Начиная с d1, выполнение pushd d2 добавляет d1 и d2 в стек и оставляет вас в d2. Выполните pushd снова без аргументов, и вы вернетесь в d1 с d1 и d2 в стеке.

Стивен Дэвисон
источник
6

Если я правильно понял, вы можете pushd .сразу после этого, popdтак что popкаталог ed будет снова помещен на вершину стека.

Эрик Карвалью
источник
Вау, это очень простое и элегантное решение. Спасибо!
Freedom_Ben