Sadece benzer bir şeye çarptı; Umarım notlarımı göndermem tamamdır. Beni git
takma adlarla takma adlar hakkında git help config
şaşırtan bir şey , muhtemelen (Git sürüm 1.7.9.5 var):
Takma ad genişletmesinin önüne bir ünlem işareti gelirse, kabuk komutu olarak değerlendirilir. Örneğin, "alias.new =! Gitk --all - ORIG_HEAD değil" tanımlandığında, "git new" çağrısı, "gitk --all --not ORIG_HEAD" kabuk komutunu çalıştırmaya eşdeğerdir. Kabuk komutlarının, bir deponun en üst düzey dizininden yürütüldüğünü ve bu dizinin geçerli dizin olmayabilir. [...]
Gördüğüm şekilde - bir takma ad "ünlem işareti ile ön ekli olduğunda" bir kabuk komutu olarak değerlendirilecekse "- neden bir işlev veya sh -c
bağımsız değişkenler kullanmam gerekiyor? neden sadece komutumu olduğu gibi yazmıyorsun?
Hala cevabı bilmiyorum - ama bence sonuçta ufak bir fark var. İşte küçük bir test - bunu kendinize .git/config
veya kendinize atın ~/.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 "
İşte bu takma adları çalıştırmak olsun:
$ 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/
... ya da: !
bir git
takma git
adda "olduğu gibi" sonrasında bir "düz" komut kullandığınızda - argümanlar listesini otomatik olarak bu komuta ekler! Bundan kaçınmanın bir yolu, betiğinizi bir işlev ya da argüman olarak çağırmaktır sh -c
.
Burada (benim için) bir başka ilginç şey, bir kabuk komut dosyasında, tipik olarak otomatik değişkenin $0
komut dosyasının dosya adı olmasını beklemesidir . Ancak bir git
diğer ad işlevi için, $0
bağımsız değişken, temelde, bu komutu belirten tüm dizinin içeriğidir ( yapılandırma dosyasına girildiği gibi).
Bu nedenle, sanırım, yanlış yorum yaparsanız - aşağıdaki durumda, bu dış çift tırnaklardan kaçar:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - o git
zaman (en azından benim için) biraz şifreli mesajla başarısız olur:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Bence, git
sadece bir argüman olarak bütün bir dizeyi "gördüğünden" !
- yürütülebilir bir dosya olarak çalıştırmaya çalıştı; ve buna karşılık "echo 'A' 'B'"
bir dosya olarak bulunamadı .
Her halükarda, git help config
yukarıdaki alıntı bağlamında, "git invokation" git new "kabuk komutunu çalıştırmaya eşdeğerdir" gitk --all --not ORIG_HEAD $ @ "; burada $ @, çalışma zamanında komut satırından git komut takma adına iletilen bağımsız değişkenlerdir. ... ". Bunun OP'de "doğrudan" yaklaşımın neden konumsal parametrelerle çalışmadığını da açıklayacağını düşünüyorum.
$1
işe yaramalıdır).