У нас больше истории для cd?

cd - может перейти в последний посещенный каталог. Можем ли мы посетить больше истории, кроме последней?

Команда, которую вы ищете, – pushd и popd .

Здесь вы можете посмотреть практический рабочий пример pushd и popd .

 mkdir /tmp/dir1 mkdir /tmp/dir2 mkdir /tmp/dir3 mkdir /tmp/dir4 cd /tmp/dir1 pushd . cd /tmp/dir2 pushd . cd /tmp/dir3 pushd . cd /tmp/dir4 pushd . dirs /tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1 

Вы не указали, какую оболочку вы используете, поэтому пусть это будет оправданием для рекламы zsh.

Да, у нас есть больше истории для cd , а именно cd -2 , cd -4 и т. Д. Очень удобно cd - TAB , особенно с системой завершения и включенными цветами:

Это то, что у меня есть .zshrc:

 setopt AUTO_PUSHD # pushes the old directory onto the stack setopt PUSHD_MINUS # exchange the meanings of '+' and '-' setopt CDABLE_VARS # expand the expression (allows 'cd -2/tmp') autoload -U compinit && compinit # load + start completion zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12' 

И результат:

введите описание изображения здесь

Чтобы ответить на ваш вопрос относительно «больше истории». Никакая функция cd - в Bash не поддерживает только один каталог, на который вы можете «перевернуть» обратно. Как утверждает в своем ответе @ Рамеш. Если вам нужна более длинная история каталогов, вы можете использовать pushd и popd для сохранения каталога или возврата к предыдущему.

Вы также можете увидеть список того, что находится в стеке с помощью команды dirs .

Подробное объяснение можно найти в этом ответе под названием: Как использовать команды pushd и popd? ,

Вы можете установить и использовать мою утилиту dirhistory для bash.

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

У вас столько истории, сколько вы хотите:

 cd() { [ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] && set -- "$@" "$DIRSTACK" && DIRSTACK='pwd -P >&3; command cd' || { command cd "$@"; return; } _q() while case "$1" in (*\'*) : ;; (*) ! DIRSTACK="$DIRSTACK '$2$1'" ;;esac do set -- "${1#*\'}" "$2${1%%\'*}'\''" done while [ "$#" -gt 1 ] do case ${1:---} in (-|[!-]*|-*[!0-9]*) : ;; (*) eval " set $((${1#-}+1))"' "${'"$#}\"" eval ' set -- "$2"'" $2"' set -- "${'"$1"'}" "$1"' ;;esac; _q "$1"; shift done eval " DIRSTACK=; $DIRSTACK &&"' _q "$OLDPWD" && DIRSTACK=$DIRSTACK\ $1 set "$?" "${DIRSTACK:=$1}"'" $1 " 3>/dev/null [ "$(($#-1))" -gt "$DIRSTACKMAX" ] && DIRSTACK="${DIRSTACK% \'/*}" unset -f _q; return "$1" } 

Это функция оболочки, которая должна позволить любой оболочке, совместимой с POSIX, предлагать историю cd zsh style. Он выполняет всю свою работу без вызова одной подоболочки, и я считаю, что ее поток довольно прост – он, кажется, правильно обрабатывает все случаи при умеренном тестировании.

Функция пытается играть так же хорошо, как и ее окружающая среда, поскольку она может все еще полагаться на полностью переносимый синтаксис – она ​​делает только одно предположение, и что переменная среды $DIRSTACK является ее свойством, с которым она будет работать.

Он canonicalizes всех путей, которые он хранит в $DIRSTACK и сериализует их все по одинарным кавычкам – хотя он гарантирует, что каждый из них безопасно цитируется и сериализуется, прежде чем добавлять его к значению переменной и не должен иметь никаких проблем с какими-либо специальными символами любой. Если переменная среды $DIRSTACKMAX установлена, она будет использовать ее как верхний предел для количества путей, которые она сохраняет в истории, иначе предел равен единице.

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

Основным механизмом функции является сам cd – и переменные среды ${OLD,}PWD . POSIX указывает, что cd меняет их для каждого перемещения пути – и поэтому это просто использует встроенные переменные оболочки и сохраняет значения до тех пор, пока вам нравится.

Другие уже рассмотрели некоторые интересные решения. Некоторое время назад я создал собственное решение проблемы, которая может быть быстро изменена, чтобы выполнить «прямую историю». Я в основном хотел «наклеить» несколько часто используемых каталогов и хотел, чтобы все открытые оболочки увидели их, и чтобы они сохранялись между перезагрузками.

 #dir_labels #functions to load and retrieve list of dir aliases function goto_complete { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir local cur possib cur="${COMP_WORDS[COMP_CWORD]}" possib="${!dir_labels[@]}" COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) ) } complete -F goto_complete goto function goto { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then key="$1" else key=default fi target="${dir_labels[$key]}" if [ -d "$target" ]; then cd "$target" echo "goto $key: '$target'" else echo "directory '$target' does not exist" fi } function label { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then target="$1" else target="default" fi dir_labels["$target"]=$PWD for i in "${!dir_labels[@]}"; do echo "$i ${dir_labels[$i]}" done > ~/.dir_labels } по #dir_labels #functions to load and retrieve list of dir aliases function goto_complete { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir local cur possib cur="${COMP_WORDS[COMP_CWORD]}" possib="${!dir_labels[@]}" COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) ) } complete -F goto_complete goto function goto { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then key="$1" else key=default fi target="${dir_labels[$key]}" if [ -d "$target" ]; then cd "$target" echo "goto $key: '$target'" else echo "directory '$target' does not exist" fi } function label { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then target="$1" else target="default" fi dir_labels["$target"]=$PWD for i in "${!dir_labels[@]}"; do echo "$i ${dir_labels[$i]}" done > ~/.dir_labels } по #dir_labels #functions to load and retrieve list of dir aliases function goto_complete { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir local cur possib cur="${COMP_WORDS[COMP_CWORD]}" possib="${!dir_labels[@]}" COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) ) } complete -F goto_complete goto function goto { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then key="$1" else key=default fi target="${dir_labels[$key]}" if [ -d "$target" ]; then cd "$target" echo "goto $key: '$target'" else echo "directory '$target' does not exist" fi } function label { unset dir_labels declare -A dir_labels { while read line; do ll_pre="${line%% *}" ll_dir="${line#* }" dir_labels["$ll_pre"]="$ll_dir" done } < ~/.dir_labels unset ll_pre unset ll_dir if [ $# -gt 0 ]; then target="$1" else target="default" fi dir_labels["$target"]=$PWD for i in "${!dir_labels[@]}"; do echo "$i ${dir_labels[$i]}" done > ~/.dir_labels } 

В основном я бы просто сделал label foo чтобы вызвать текущий каталог foo , а затем из любой оболочки, goto foo whould cd прямо там. Пустой аргумент: label создавал бы цель по умолчанию для goto .

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

Скрипт acd_func.sh выполняет именно то, что вы описываете. По сути, он перегружает функцию cd и позволяет вам ввести cd -- для получения списка ранее посещаемых каталогов, из которых вы можете выбрать по номеру. Мне очень сложно использовать bash без этого, и это первое, что я устанавливаю в новой системе.

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

 pushd /home; pushd /var; pushd log 

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

 dirs -v 

Вывод:

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

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

 cd ~1 

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

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

теперь 1..3 будет держать там позицию, я читал это где-то, но больше не знаю, так жаль, что не отдал кредит

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

Вы можете использовать мою функцию «cd history» из http://fex.belwue.de/fstools/bash.html

Он запоминает каждый каталог, где вы были, и с помощью «cdh» вы увидите список из последних 9 каталогов. Просто введите номер, и вы вернетесь в этот каталог.

Пример:

 framstag @ wupp: /: cdh
 1: / usr / local / bin
 2: / var
 3: /
 4: / tmp / 135_pana / 1280
 5: / tmp / 135_pana
 6: / tmp / weihnachtsfeier
 7: / tmp
 8: / local / home / framstag
 выберите: 4
 framstag @ wupp: / TMP / 135_pana / 1280:

cdh работает с autocd aka «cd без cd»: вам не нужно вводить cd или pushd.

Я хотел бы порекомендовать вам свою расширенную функцию «cd»:

https://github.com/dczhu/ltcd

введите описание изображения здесь

Он обеспечивает следующие функции, облегчающие жизнь:

  • Глобальный каталог, который показывает недавно посещаемые каналы из всех вкладок / окон терминала.
  • Локальный каталог, который является локальным для текущего сеанса оболочки.
  • Оба списка поддерживают быструю навигацию, используя j / k (вниз / вверх), цифры и поиск слов.
  • Глобальные бесплатные прыжки (например, «cd dir» или «cd ar» для перехода в / path / to / foo / bar / directory /).

См. Функцию cdh в «Программирование оболочки, 4е» на стр. 312. Она хранит историю в массиве.

Вот более продвинутая версия: https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M

Он хранит историю в файле CDHISTFILE и позволяет перейти к самой последней директории, содержащей строку, например,

cd -src

Он устанавливает себя поверх существующей команды cd, выполняя alias cd=_cd