Intereting Posts
Что мне нужно сделать, чтобы закончить этот сервис / таймер? Как заставить tightvnc прослушивать входящие соединения на порту 5900? Невозможно убить группу процессов при вызове PHP apt hook для проверки конкретных изменений пакета установка разрешений по умолчанию с помощью setfacl Как я могу вызвать другой скрипт оболочки как подпрограмму? Разделить несколько столбцов на два столбца на основе первого столбца Как работает работа на дому? Некоторые проблемы при установке libvirt Невозможно сделать .zhistory символической ссылкой Какова самая базовая версия Linux с пакетом-менеджером? Разрешить приложению использовать общий общий объем сети, если приложение знает адрес или путь тома Установка Linux на раздел SATA, с Windows, установленным на SSD Как привязать определенные файлы при использовании сортировки? Другие альтернативы команды столбца

У нас больше истории для 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