Как я могу создать псевдоним для команды 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 псевдонимами . Однако в качестве альтернативы вы всегда можете выбрать подходящее псевдоним.

jw013
источник
См. Примечание добавлено, чтобы ответить о git configнетgit-config
Майкл Даррант
В этом ответ на нить , что вы связаны ясно, что это можно переопределить существующие gitкоманды с псевдонимами, только с немного сценария оболочки. (Я не публикую этот комментарий как критику, кстати. Этот ответ был опубликован спустя почти год после вашего! Я просто публикую его в надежде, что люди могут найти его полезным.)
sampablokuper
17

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

Чтобы вызвать команду git commit , вам нужно написать ее

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

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

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

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

Будет ли сделать git commandкоманду (если вызывается 'git command'(с одинарными кавычками) только) псевдоним для gitкоманды с commitи -vаргументами. Не то, что вы искали, я думаю, хотя.

Поскольку вы можете использовать псевдонимы aliasтолько для команд , все, что вы можете использовать для псевдонима, - это gitкоманда, и вам нужно было бы присвоить ей псевдоним, который вставляет «-v» после «commit» в список аргументов. Лучше всего было бы использовать решение @ 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 для псевдонима ваших команд git с помощьюgit-config

darnir
источник
Ты имеешь в виду if [[ $1 == 'commit' ]]...? Расширение $ @ может иметь больше аргументов для коммита, который вы действительно хотите сохранить.
Кодзиро
Правильно! Мой плохой .. Я просто изменил утверждение, которое я использовал для своей системы.
Дарнир
Это потрясающе - спасибо - это идеально для того, что мне нужно;
cgseller
4

Из справочной страницы bash alias

Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если это так, это слово заменяется текстом псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые входные данные оболочки, включая метасимволы оболочки, за исключением того, что имя псевдонима может не содержать `= '.

Первое слово замещающего текста проверяется на псевдонимы, но слово, идентичное раскрываемому псевдониму, не раскрывается во второй раз. Это означает, что, например, псевдоним ls можно присвоить «ls -F», и Bash не пытается рекурсивно развернуть текст замены.

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

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

Это может быть адаптировано к git.

Ренан
источник
Ссылка, которую вы даете, отличается от документации по bash, которую я имею, и, кажется, противоречит поведению bash. Выше сказано, что пробелы разрешены в псевдонимах. Для меня это больше похоже на поведение zsh, даже если эта страница явно говорит bash.
Стефан Шазелас
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!'" 
Empus
источник
-1

Из этого примера это должно работать:

Итак, если вы все еще хотите использовать sudo с другими командами, но не с shutdown, и если вы можете позволить себе псевдоним shutdown для чего-то другого, вы можете иметь:

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

Но с вашими командами:

alias git='git '
alias commit="commit -v"
Pureferret
источник