Як я можу створити псевдонім для команди git [action] (яка включає пробіли)?


29

Більшість моїх псевдонімів мають такий вигляд: alias p='pwd'

Я хочу псевдонім, git commitщоб це булоgit commit -v

Але спроба створити псевдонім з пробілом дає помилку:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

Відповіді:


31

Це не пряма відповідь на ваше запитання (оскільки псевдоніми можуть бути лише одним словом), але вам слід використовувати git-config:

git config --global alias.civ commit -v

Це створює псевдонім git, так що він git civпрацює git commit -v. На жаль, AFAIK не може переосмислити існуючі команди git псевдонімами . Однак ви завжди можете вибрати відповідне ім’я псевдоніма, щоб жити як альтернативу.


Дивіться примітку, додану, щоб відповісти про git configнеgit-config
Майкл Дюрант

У цьому відповідь на нитку , що ви пов'язані ясно, що це можна перевизначити існуючі gitкоманди з псевдонімами, тільки з трохи сценарію оболонки. (Я не публікую цей коментар як критику, BTW. Ця відповідь була опублікована майже через рік після вашої! Я просто публікую її з надією, що люди можуть вважати її корисною.)
sampablokuper

17

Ви говорите про команду, яка включає пробіл, але тут команда є gitі місця там немає.

Щоб викликати команду git commit , вам потрібно буде написати її

git\ commit ...
'git commit' ...
"git commit" ...

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

csh, tcsh або zsh дозволять вам створювати псевдоніми будь-якого з перерахованих вище, але не bash або ksh (хоча pdksh дозволить вам, але ви не дасте вам використовувати їх). В zsh:

alias "'git commit'=git commit -v"
'git commit' ...

Зробить git commandкоманду (при виклику як 'git command'(лише з цитатами)) псевдонім для gitкоманди з аргументами commitта -v. Я не здогадуюсь про те, що ви шукали.

Оскільки aliasможна створювати лише псевдоніми команд , все, що ви можете псевдонімом тут, є gitкомандою, і вам потрібно буде додати псевдонім до чогось, що вставляє "-v" після "фіксації" у свій список аргументів. Найкраще було б скористатися рішенням @ jw013, але якщо з якихось причин ви не можете чи не хочете, замість того, щоб використовувати псевдонім, ви можете використовувати функцію, щоб виконати цю роботу:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
Зауважте, що дозволити псевдоніми з пробілами або іншими спеціальними символами - це функція csh, яка не присутня в оболонках стилю Борна (що zsh емулюється дивним чином). Оболонки в стилі Борна відключають псевдонім розширення, коли перше слово цитується будь-яким способом, див . Відповідь Ренана .
Жил "ТАК - перестань бути злим"

Так. Тому я сказав, що це працює лише в csh, tcsh та zsh, у яких немає цієї помилки. Зауважте, що оболонка Bourne не підтримує псевдоніми. Псевдоніми ввели csh.
Стефан Шазелас

9

У Bash ви не можете створити псевдонім для команди з будь-яким пробілом.
Однак я використовую таку функцію в моєму .bashrc як спосіб вирішення.

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

Як це працює: Ви починаєте з команди, яку хочете зателефонувати. У моєму випадку це так sudo.
Потім ви згадуєте, які саме параметри будуть потрібні. У цьому випадку pacman -Syu.
Якщо запускається, яку команду вона повинна виконувати? У наведеному вище твердженні це так pacup.sh.
Інакше, яка команда повинна бути виконана, sudo $@. $@це, як ви здогадалися, список параметрів, який приймає команда.

Отже, складаючи команду для вашого конкретного випадку, було б:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

Однак це рішення є для більш загального випадку, коли потрібно псевдоніми команд з пробілами в них.
У вашому конкретному випадку я рекомендую вам перейти з рішенням jw013 для отримання псевдоніму ваших команд gitgit-config


Ви не маєте на увазі if [[ $1 == 'commit' ]]...? Розширення $ @ може мати більше аргументів за фіксацію, яку ви насправді хочете зберегти.
kojiro

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

Це приголомшливо - дякую - ідеально підходить для того, що мені було потрібно;
cgseller

4

З сторінки " bash alias man"

Перше слово кожної простої команди, якщо не цитується, перевіряється, чи є у неї псевдонім. Якщо так, це слово замінюється текстом псевдоніма. Псевдонім ім'я та текст заміни можуть містити будь-які дійсні введення оболонки, включаючи метахарактеристики оболонки, за винятком того, що ім'я псевдоніма може не містити `= '.

Перше слово тексту заміни тестується на псевдоніми, але слово, ідентичне псевдоніму, який розгортається, не розгортається вдруге. Це означає, що можна псевдонім ls до "ls -F", наприклад, а Bash не намагається рекурсивно розширювати текст заміни.

Отже, оскільки перевіряється лише перше слово, ви не можете мати псевдонім з кількома словами. У цьому питанні щодо Супер Користувача подано рішення щодо використання функції:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Він може бути адаптований до git.


Це посилання, яке ви надаєте, відрізняється від баш-документації, яку я маю, і, здається, суперечить баш-поведінці. Вище сказано, що пробіли, наприклад, дозволені в іменах псевдонімів. Мені це більше схоже на поведінку zsh, навіть якщо ця сторінка чітко каже баш.
Стефан Шазелас

2
Оболонки @sch Bourne / POSIX обходять розширення псевдоніму, якщо слово будь-яким чином цитується. Наприклад, \lsобходить псевдонім для ls.
Жил "ТАК - перестань бути злим"

1
@Gilles. Оболонка Bourne не реалізує псевдоніми. POSIX говорить, що без котирування слово, що відповідає дійсному псевдоніму (є лише ASCII alnum + [_!%,@]), має бути розширено. Він не забороняє розширення, такі як zsh-псевдонім '\ ls', або ksh / dash / bash / zsh-псевдонімa-b інакше не існувало б жодної оболонки POSIX. Це просто говорить, що портативний скрипт (не оболонка) не повинен використовувати жоден подібний псевдонім.
Стефан Шазелас

2
@sch POSIX дозволяє реалізаціям використовувати інші символи в псевдонімах, але цитування будь-якої частини слова інгібує псевдонім розширення . Якщо ви пишете 'git commit'в командній позиції в оболонці POSIX, вона повинна викликати вбудовану утиліту, функцію або зовнішню команду.
Жил "ТАК - перестань бути злим"

0

Незважаючи на те, що правильним рішенням є використання псевдонімів, як запропоновано jw013, для створення псевдонімів з пробілами ви можете NEST псевдоніми.

Наприклад, у мене є псевдонім для видалення гілки як локально, так і віддалено, але я хотів би, щоб користувач завжди вказував гілку:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

З цього прикладу це має працювати:

Отже, якщо ви все ще хочете використовувати sudo з іншими командами, але не з вимкненням, і якщо ви можете дозволити вимкнення псевдоніма на щось інше, ви можете мати:

alias sudo='sudo '
alias shutdown="echo nope"

Але з вашими командами:

alias git='git '
alias commit="commit -v"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.