TL; DR:最も簡単なコマンドには関数アプローチを使用し、クォートで問題が発生したら外部スクリプトに切り替えます。ちょうどsh -c
を避けてください。
私たちは、have a look at the git sourceとすることができます。 git
の方法で引用符を解析し、その結果にスペースを含むシェルメタキャラクタがない場合はファイルとして実行し、それ以外の場合はexeclp("sh", "-c", "result \"[email protected]\"", "result \"[email protected]\"", args...)
と同等の処理を実行します。
ことに基づいて、エイリアスを作成するための最良の方法は、外部スクリプトを作成することは間違いなくあると使用:
[alias]
myAlias = !/path/to/script
これは、外部ファイルを必要としますが、他のすべての方法でそれが良いでしょう:
- 必要なインタープリタを実行します。他のフォームは
sh
コードを実行することができます(違いはC++対Cのようです)。
- 必要がない限り、追加のシェルは開始されません。
git
あなたの実行ファイルに直接execve
します。
- エスケープする必要はありません。それは単なる普通のスクリプトです。
- 驚きや
git
の知識が必要です。それは単なるスクリプトです。あなたの提案のうち
、ランナーアップは次のとおりです。
[alias]
fAlias = "!f() { ... ; }; f"
ので、これはそれほど素晴らしいです:あなたは、残念ながら唯一の任意のbash
機能を使用sh
で実行するため、することはできません
- 。
- シェルは常に起動されますが、少なくとも1つのみです。
git
一部の引用符はエスケープする必要があります。
git
のエスケープを知っておく必要がありますが、関数の引数を使用するだけなので、コマンドの実行方法を正確に知らなくても一般に得ることができます。
最後の一つは、これまでで最悪です:
[alias]
shAlias = !sh -c \" ... \"
ので、それはひどいです:あなたが唯一のsh
で実行することができます
- 。
- 正当な理由がないため、余分なシェルを起動します。
- と
git
の両方が逃げており、さらにレベルがsh
になることがあります。
- あなたはダブルエスケープをする方法という
git
で、sh
のコードを逃れるために、両方の方法を知っておく必要があり、どのようgit
は、追加の引数がある場合は、あなたのコマンドに"[email protected]"
を付加し、$1
、$2
として追加パラメータを渡します。
のは、あなたがssh
経由でリモートサーバ上のパスを取得するには、このコマンドのエイリアスを作りたかったとしましょう、実用的な違いを実証するために:
ssh "$1" 'echo "$PATH"'
あなたがコピー&ペーストをしますかそれは、ファイルにそのまま、シェバングを追加し、使用:
[alias]
get-remote-path = !/path/to/my/script
それとも、エスケープgit
のビットを追加し、私たちすることができます電子機能アプローチ:
[alias]
get-remote-path = "!f() { ssh \"$1\" 'echo \"$PATH\"'; }; f"
それとも私たちが苦労脱出しsh -c
アプローチで再び逃げることができる(いや、それが最後の言葉なしでは動作しません):
[alias]
get-remote-path = !sh -c 'ssh \"$1\" '\\''echo \"$PATH\"'\\' cthulhu
明らかに、それはより良いですスクリプトを使用するか、最悪の場合は、複雑なコマンドが必要になるまで関数のアプローチを使います。
クトゥルフの参照が冗談であるかどうかわかりません...答えを見つけ出すときに推測すると、私は本当のシェルスクリプターです – henry