git logコマンドにエイリアスを追加しました。
$ alias gl
alias gl='gn -c git log -w -b -p --ignore-blank-lines --full-history'
$ alias gn
alias gn='git-number'
コマンドの-nフラグはこの
git-number
ようにサブコマンドを実行しますsh -c
。
何か変なことを見つけました。私が実行したとき:
gl -- lib/X.pm
仕組みは次のとおりです。
gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
しかし、私はこれを楽しみにしています(文字列の末尾に引用符ではありません)。
gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
コマンドの完全な履歴は次のとおりです。
$ gl -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
commit 9ce3e165f284d55503eff9b627ef3723854c53bb
...other expected output
alias
エイリアスオプションと新しいオプションを強制的に一緒に使用するにはどうすればよいですか?
答え1
エイリアシングは、コマンドラインで文字列をテキストに置き換える「愚かな」操作です。エイリアスはパラメータを使用したり操作を実行したりすることはできず、エイリアスを置き換えるためにテキストのみを提供できます。あなたの例では、エイリアスの後にパラメータを取得したいと思います。入れるで呼び出されたコマンドにこれを入力しますgit-number
。エイリアスはパラメータを理解していないため、これを行うことはできません。
シェル関数を使用してください。次のシェル関数は、ユーティリティで実行されるコマンドに引数を提供するのとまったく同じようにgit-number -c
機能すると想定されます。sh -c
gl () {
git-number -c 'git log -w -b -p --ignore-blank-lines --full-history "$@"' gn "$@"
}
シェル関数はコマンドgit-number -c
で呼び出され、git log
その後にランダムな選択文字列gc
(git-number -c
このように動作する場合は実行シェルにsh -c
配置されます)と関数の引用符付き引数が続きます。$0
git log
"$@"
コマンドはgit log
(git-number -c
同様に機能する限りsh -c
)一連の引数で呼び出され、その後にシェル関数によって渡された引数が続きます。
gn
この関数は2つの引数として呼び出され、--
最終的lib/X.pm
には追加の引数git log
(via)の後に。git-number -c
--
lib/X.pm
gn -c "git log -w -b -p --ignore-blank-lines --full-history -- -- lib/X.pm"
パラメータを正しく渡すために作業しているため、スペースや改行などを含むパラメータ渡しもサポートされています。単にそうすれば不可能です。注入 $@
git-number -c
シェル関数によって呼び出されるコマンドを入力します。