push / pop текущий каталог?

66

С bash есть ли способ нажать и вытолкнуть текущий рабочий каталог? Я пытался писать, bash;cd dir; ./dostuff;exit;но текущий каталог сейчас dir.


источник

Ответы:

91

Есть pushdиpopd

Bash будет хранить историю посещенных вами каталогов, вам просто нужно спросить. Bash хранит историю в стеке и использует команды pushd и popd для управления стеком.

Больше читать

Пример:

$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me
Nifle
источник
1
Выдержка из ссылкиpushd Saves the current directory on the top of the directory stack and then cd to dir. With no arguments, pushd exchanges the top two directories.
Мастер Шеф
31

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

( cd dir ; ./dostuff )
Игнасио Васкес-Абрамс
источник
1
Brilliant! Не нужно нажимать / выдавливать, когда нужно просто запустить команду в другом каталоге (например, обновить зависимость), а затем вернуться к текущему.
Дан Даскалеску
12

Если вам не нужно несколько уровней истории каталогов, вы также можете сделать:

cd foo
# do your stuff in foo
cd -

По сравнению с pushd/ popdэто имеет тот недостаток, что в случае cd fooнеудачи вы попадете в неправильный каталог с cd -.

(Вероятно, cd -это более удобный внешний вид сценариев. «Вернемся туда, где я только что был».)

tuomassalo
источник
4

Я использую псевдоним для отслеживания изменений в моем каталоге, поэтому в «cd» я могу просто вернуться туда, где я использовал «cd.», Или вернуться назад, используя «cd ..» и т. Д .;

alias pushdd="pushd \$PWD > /dev/null"
alias cd='pushdd;cd'
alias ssh='ssh -A'
alias soc='source ~/.bashrc'
#below to go back to a previous directory (or more)
alias popdd='popd >/dev/null'
alias cd.='popdd'
alias cd..='popdd;popdd'
alias cd...='popdd;popdd;popdd'
alias cd....='popdd;popdd;popdd;popdd'
#below to remove directories from the stack only (do not 'cd' anywhere)
alias .cd='popd -n +0'
alias ..cd='popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0'
ОГТ
источник
1
Можете ли вы объяснить более подробно, что делает этот код?
bwDraco
Это умно. У меня есть псевдонимы вокруг моих pushd и popd, чтобы делать то, что мне нравится. Я использую стек каталогов все время. Я терпеть не могу смотреть где-то на CD, а затем прокручивать назад в поисках предыдущего каталога для вырезания и вставки. Я не могу выполнять большую часть своей работы в своем домашнем каталоге из-за квот, поэтому мне приходится использовать хранилище в сети.
Майкл Мэтьюз
1
..cdДостаточно ли надежен псевдоним ? похоже, он удаляет только последние 10 элементов из стека.
reynoldsnlp