41

Иногда, когда я хочу перейти в родительский каталог, я ошибочно набираю cd ,, вместо cd .. Есть ли способ, которым я могу заставить bash считать эти утверждения одинаковыми? Я никогда не использую запятые в моих командах. В идеале я хотел бы, чтобы псевдоним ,, .. Когда я попробовал это, это не сработало. Почему это не сработало? Как еще я могу подойти к этой проблеме?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

5 ответов5

58

Псевдонимы не предназначены для этого, но вы можете создать функцию с именем cd которая является оберткой для реального cd . Этот работает для меня! Просто поместите его в свой файл .bash_profile или в свой профиль.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Или с комментариями и красивым форматированием:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

РЕДАКТИРОВАТЬ

Спасибо @derobert за указание на то, что if then else здесь лучше, чем && || , Кроме того, я только что понял (* facepalm *), что эта реализация будет работать только в том случае, если какие-либо аргументы без пути (например, -L -P) не являются первым аргументом. Так что будьте осторожны, если у вас есть плохая привычка вводить cd -L ,, это вам не поможет. И это не тривиально, чтобы правильно обращаться, я думаю.

45

ЗШ:

Если вы используете zsh alias -g ,,=".." - это то, что вам нужно, но это приведет к тому, что ",," будет расширяться везде, а не только при использовании с cd .

От man zshbuiltins:

Если присутствует флаг -g , определите глобальный псевдоним; глобальные псевдонимы расширяются, даже если они не встречаются в командном положении.

BASH:

Если ограничено bash (поскольку вопрос помечен как ), прочитайте следующее:

Как и требовалось, это чисто псевдонимное решение, однако оно сделает больше, чем требуется, возможно, расстроит пользователя (см. Предупреждение в конце моего поста).

Цитирую man bash:

Если последний символ значения псевдонима является пустым, то следующее слово команды, следующее за псевдонимом, также проверяется на расширение псевдонима.

Поэтому достаточно псевдонима cd с дополнительным пробелом (чтобы разрешить расширение его следующего аргумента), а затем псевдоним ,, to .. Видеть, что

alias cd='cd '
alias ,,='..'

дает именно то, что вам нужно.

Обратите внимание, что это верно не только для bash (и его alias ), но и для всех POSIX-совместимых оболочек. Цитируем пример из man 1p alias (руководство не описывает эту функцию явно, только через пример):

  1. Настройте nohup так, чтобы он мог иметь дело с аргументом, который сам является псевдонимом:

           alias nohup="nohup "
    

Предупреждение: как пишет @PeterCordes в своем комментарии, это автоматически приведет к расширению других псевдонимов при записи после cd . Может потребоваться написать cd \grep если вы хотите изменить каталог на каталог с именем grep но ваш grep является псевдонимом для grep --color=auto . Без обратной косой черты, cd сообщит об ошибке "слишком много аргументов" (вы не можете cd в двух каталогах сразу)!.

29

Псевдонимы должны быть первым словом команды. Кроме того, псевдоним должен быть заменен на слово, поэтому без пробелов).

Справочное руководство Bash: псевдонимы

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

Вы можете использовать псевдоним как .. и ,, быть cd ..

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
3

Другой способ сделать .. изменить каталог - включить функцию autocd в Bash:

shopt -s autocd 

Это автоматически изменит каталог, когда вы введете имя одного:

~$ /tmp
cd /tmp
/tmp$ 

Вы все еще должны сделать псевдоним для ,, но это можно сделать с помощью только alias ,,=..

2

Уже есть приложение для этого: https://github.com/shyiko/commacd (нет связи со Стэнли Шуйико).

commacd экспортирует три команды: (для перехода вперед), , (назад) и ,, (назад + вперед):

Все трое сначала пытаются найти соответствие по префиксу. Только если результаты не найдены, они переключатся на совпадение подстроки (нечеткое)

Чтобы ответить на ваш вопрос, скрипт добавляет псевдонимы к трем функциям, которые он определяет:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .