Чи можна ",," відчужувати ".."?


41

Іноді, коли я хочу перейти на батьківський каталог, я помилково набираю cd ,,замість cd ... Чи є спосіб, який я можу змусити Баша вважати ці твердження однаковими? Я ніколи не використовую коми в своїх командах. В ідеалі я хотів би псевдонім ,,на ... Коли я спробував це, не вийшло. Чому це не вийшло? Як ще я можу підійти до цієї проблеми?

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

6
Псевдонім - це програма, яку потрібно запустити, а не аргумент для програми; так $ ,,буде скаржитися, як такої: bash: ..: Is a directory. (Іншими словами, це не виконується файл.)
jpaugh

5
@jpaugh: Більш чіткий спосіб сказати, що це: розширення псевдоніму відбувається лише в першому "слові" команди. Отже, як ви кажете, він працює лише для імен команд, а не для аргументів. (І ти навіть не зміг alias 'cd ,,'='cd ..'. Ну, ти міг би, але вам доведеться запустити це так, cd\ ,,щоб все це було одним словом.)
Пітер Кордес,

5
Розглянемо zsh. Він має глобальні псевдоніми, тому працює alias -g ,,=..і cd ,,працює так, як ви цього очікуєте.
муру

1
Бокове мислення: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
Імхо: не роби цього. Використання псевдонімів для приховування друкарських помилок є поганою практикою. Ці помилки можуть призвести до вставленого копію коду чи екранізації екрана. Він не працюватиме в інших хостах чи акаунтах. І така модифікація (залежно від способу її здійснення) може спричинити інші, несподівані, важкі помилки налагодження. Моя пропозиція: якщо ви неправильно введете команду, просто введіть її ще раз ;-).
jjmontes

Відповіді:


45

ZSH:

Якщо ви користуєтеся zsh alias -g ,,=".."тим, що вам потрібно, але це призведе до розширення ",," скрізь, не тільки при використанні cd.

Від man zshbuiltins:

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

БАШ:

Якщо обмежено обмеженням bash(оскільки питання позначено ), прочитайте наступне:

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

Цитування man bash:

Якщо останній символ значення псевдоніму є порожнім, то наступне командне слово, що йде за псевдонімом, також перевіряється на наявність розширення псевдоніму.

Тому достатньо псевдоніму cdз додатковим простором (щоб дозволити розширення наступного аргументу), а потім псевдоніму ,,до ... Бачиш це

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можете відразу до двох каталогів) !.


22
Це розумний, але злий хакер. Я б не хотів цього робити; занадто легко для того, щоб випадково вкусити вас. наприклад, якщо у вас є псевдонім для команди, яку ви зазвичай виконуєте, і ви хочете перейти cdв каталог його вихідного коду. Або інші зіткнення між вашими псевдонімами та загальними іменами каталогу. Ніби cd drрозшириться cd disown -rдля мене, з цим псевдонімом. У будь-якому разі, набагато краще перекрити вбудований cdз такою функцією, як IMO.
Пітер Кордес

8
+1 для чистого псевдоніму (я щось дізнався). Водночас я згоден з коментарем Петра. Я думаю, що до вашої відповіді слід додати якесь явне попередження.
Каміль Маціоровський

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
}

EDIT

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


16
@BenjiWiebe Я думаю, що версія "коментарі та гарне форматування" буде краще з if-then-else.
zwol

Нічого собі, багато хороших ідей. Я бачу, що ви використовуєте функцію редагування, щоб подбати про необхідні виправлення. Я не витрачав багато часу на тестування. :)
BenjiWiebe

1
Крім того, просто перезапишіть $1перед виконанням вбудованого:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}", або ви втратите що-небудь після першого аргументу.
чепнер

8
Також технічно ..це не повинно бути першим аргументом; cdв bashможе приймати різні варіанти ( -P, -L, -@, -e).
чепнер

29

Псевдоніми повинні бути першим словом команди. Також псевдонім повинен бути замінений словом, тому немає пробілів).

Довідник по Bash: Псевдоніми

Псевдоніми дозволяють замінити рядок на слово, коли воно використовується в якості першого слова простої команди.

Ви могли псевдонімом ..і ,,бути, і бути cd ...

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

Саме це я і роблю! : D ці дві крапки / коми набирати набагато простіше, ніжcd ..
rav_kr

10
+1, це зовсім не погана ідея. Ще один спосіб зробити це .. в Bash - це за допомогою shopt -s autocdякого ви можете змінити будь-який каталог, просто ввівши його ім'я. Звичайно, ви все одно псевдонім для,,
ilkkachu


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.