ちょうど同じようなものにぶつかった。私のメモを投稿してよいと思います。git
エイリアスと引数について私を混乱させる1つのことは、おそらく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
です。
ここでもう1つ興味深いのは(私にとって)、シェルスクリプトでは、通常、自動変数$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
はうまくいくはずです)。