Просто наткнувся на щось подібне; сподіваюся, що все в порядку, щоб розмістити свої замітки. Одне, що бентежить мене щодо 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/
... або: коли ви використовуєте команду "plain" після псевдоніма !
"as-is" 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 з командного рядка під час виконання. ... ". Я думаю, що це також пояснить, чому "прямий" підхід в ОП не працює з позиційними параметрами.
$1
повинен працювати).