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