Просто наткнулся на что-то подобное; надеюсь, что все в порядке, чтобы опубликовать мои заметки. Одна вещь, которая путает меня в gitпсевдонимах с аргументами, вероятно, происходит из git help config(у меня git версия 1.7.9.5):
Если расширение псевдонима начинается с восклицательного знака, оно будет рассматриваться как команда оболочки. Например, при определении «alias.new =! Gitk --all --not ORIG_HEAD» вызов «git new» эквивалентен выполнению команды оболочки «gitk --all --not ORIG_HEAD». Обратите внимание, что команды оболочки будут выполняться из каталога верхнего уровня репозитория, который не обязательно может быть текущим каталогом. [...]
На мой взгляд, если псевдоним «будет обрабатываться как команда оболочки» с префиксом восклицательного знака, - зачем мне использовать функцию, или sh -c аргументы; почему бы просто не написать мою команду как есть?
Я до сих пор не знаю ответа - но я думаю, что на самом деле есть небольшая разница в результатах. Вот небольшой тест - добавьте это в свой .git/configили свой ~/.gitconfig:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
Вот что я запускаю эти псевдонимы:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... или: когда вы используете "обычную" команду после !"как есть" вgit псевдониме - тогда gitавтоматически добавляет список аргументов к этой команде! Способ избежать этого - вызвать скрипт как функцию или как аргументsh -c .
Еще одна интересная вещь (для меня) заключается в том, что в сценарии оболочки обычно ожидается, что автоматической переменной $0будет имя файла сценария. Но для gitфункции псевдонима,$0 аргумент, в основном, является содержимым всего строки, определяющей эту команду (как указано в файле конфигурации).
Вот почему, я думаю, если вы ошибетесь в кавычках - в приведенном ниже случае это будет экранировать внешние двойные кавычки:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - тогда gitпотерпел бы неудачу с (для меня, по крайней мере) несколько загадочным сообщением:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Я думаю, так как git«видел» целую строку как только один аргумент! - он пытался запустить ее как исполняемый файл; и, соответственно, не удалось найти "echo 'A' 'B'"файл.
В любом случае, в контексте git help configприведенной выше цитаты, я бы предположил, что более правильно заявить что-то вроде: " ... вызов" git new "эквивалентен выполнению команды оболочки" gitk --all --not ORIG_HEAD " $ @ ", где $ @ - аргументы, передаваемые псевдониму команды git из командной строки во время выполнения. ... ". Я думаю, что это также объясняет, почему «прямой» подход в OP не работает с позиционными параметрами.
$1должен работать).