просто наткнулся на нечто подобное;надеюсь, что все в порядке, чтобы опубликовать мои заметки.Одна вещь, которая смущает меня относительно 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
- это, по сути, содержимое строки whole , определяющей эту команду (как указано в файле конфигурации).
Вот почему, я полагаю, если вы ошибетесь в кавычках - в приведенном ниже случае это будет экранировать двойные внешние кавычки:
[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 не работает с позиционными параметрами.