Могу ли я использовать cd ../ .. в качестве псевдонима?

11

Я использую Windows и Ubuntu параллельно и работаю с консолью на них обоих.

На Windows я могу сделать

C:\Users\Thomas>cd..\..
C:\>

Однако в Linux это не работает ни с обратной косой чертой, ни с прямой косой чертой.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Поскольку я часто допускаю эту ошибку, я попытался определить псевдоним .bash_aliasesдля этой ситуации:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Когда я начинаю новый Bash, я получаю

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

Как бы я настроил псевдонимы для cd..\..и cd../..правильно?

cd..\.., Кажется, есть проблемы с экранирующим символом:

21:39:43 $ cd..\..
bash: cd....: command not found

Это не работает, даже если я определю другой псевдоним для cd.....

Томас Веллер
источник
2
Ты не можешь Команда, псевдоним или имя файла не могут содержать /символ. \ Версия, с другой стороны, должно работать нормально.
фкрем
@fkraiem: Кажется, у версии с обратной косой чертой есть проблемы с escape-символом. Обновил вопрос.
Томас Уэллер
О, действительно. From man bash: символы /, $, `и = и любые метасимволы оболочки или символы цитирования, перечисленные выше, могут не отображаться в псевдониме.
фкрем
Черт. Я пытался, man aliasи этого не было. Если вы дадите это как ответ, я приму это.
Томас Уэллер
Псевдонимы - это одно, а функции оболочки - другое. Посмотри еще раз.
Алексис

Ответы:

10

/и \находятся среди символов, которые не могут появляться в псевдониме Bash. От man bash:

Символы /, $`, и =и любые метасимволы оболочки или символы цитирования, перечисленные выше, могут не появляться в псевдониме.

В качестве обходного пути вы можете переключиться на Zsh, что позволяет:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
fkraiem
источник
12

Вы не можете использовать косую черту в псевдониме. Однако Bash позволяет использовать их в именах функций, поэтому вы можете сделать это функцией:

cd../.. () { cd ../..; }

Вы не можете использовать обратную косую черту в псевдониме или имени функции. Символ обратной косой черты cd..\..заключает в кавычки следующий символ, поэтому он анализируется cd....задолго до того, как эта строка будет найдена в качестве имени команды. Если вы хотите вызвать команду с именем cd..\.., вам нужно ввести cd..\\.., 'cd..\..'или чего - то подобного. Кроме того, имя команды, которое каким-либо образом указано в кавычках, не учитывается при поиске псевдонима, поэтому вы никогда не сможете использовать псевдоним, содержащий обратную косую черту. Bash также не допускает обратную косую черту в именах функций. Так cd..\..как анализируется как cd...., вы можете определить функцию с именем cd....(как указано выше).

Если вы используете cdкоманду, вам нужно будет ввести пробел после нее, как и любую другую команду. Но вы можете сохранить набор текста, не печатая cdвообще. Установите autocdпараметр с помощью следующей строки ~/.bashrc:

shopt -s autocd

Затем вы можете ввести имя каталога в командной строке, и «выполнение» этого каталога изменится на него.

~/some/sub/directory$ ../..
~/some$ 
Жиль "ТАК - перестань быть злым"
источник
Если я сделаю shoptэто, я, вероятно, скоро пропущу эту функциональность в Windows :-)
Томас Веллер
Хм, это не правда. Косые черты принимаются в именах функций bash.
Алексис
@alexis Ах, да, вы можете использовать косую черту в bash. Исправлено, спасибо.
Жиль "ТАК - перестань быть злым"
@ThomasW. Конечно ты будешь. autocdбыла одна из причин, по которой я перешел на zsh, когда у bash его не было. Единственный достойный способ использовать Windows - это установить Cygwin в любом случае, в комплекте с zsh.
Жиль "ТАК - перестань быть злым"
5

"Вы не можете использовать косую черту в псевдониме или имени функции "? Это новость для меня. Я годами использовал следующую функцию оболочки в Linux и OS X bash, и у меня никогда не было проблем:

function ../.. { cd ../..; echo "$PWD"; }

Естественно, cd../..это также хорошее имя функции. Косая черта может использоваться в имени функции оболочки.

Что касается версии с обратной косой чертой, вы не можете встроить ее в псевдоним или имя функции, но вам не нужно: Когда вы печатаете cd..\.., bash интерпретирует обратную косую черту как escape и пытается выполнить полученный результат cd..... Так определите это, и вы сможете делать все, что вы хотели. Добро пожаловать.

function cd.... { cd ../..; } 
Alexis
источник
2

Если вы хотите сохранить псевдонимы, почему бы просто не сделать:

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

Или, если вам нужно пойти путь обратно:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

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

джон
источник