2017-10-11 3 views
0

私は、引数を取るgitエイリアスを書いているうちに、自分の足を濡らしてきました。私はまだだところ、これはない - 私はバッシュの上の速度まで得れば(ように思えgitエイリアススクリプトで `sh -c " ... "`または `"!f(){...;}; f "を使うべきですか?

[alias] 
    shAlias = !sh -c \" ... \" 

[alias] 
    fAlias = "!f() { ... ; }; f" 

で関数を実行している他の人とシェルスクリプトを実行している何人かの人々を見てきました)私がやったことのいずれかはどちらのフォームでも実行可能です。

どのような状況では、他の状況よりもどちらかが優先されますか?

実現可能性を超えて、処理の違いがありますか?メモリ使用量/速度/ etc?

答えて

2

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 

明らかに、それはより良いですスクリプトを使用するか、最悪の場合は、複雑なコマンドが必要になるまで関数のアプローチを使います。

+0

クトゥルフの参照が冗談であるかどうかわかりません...答えを見つけ出すときに推測すると、私は本当のシェルスクリプターです – henry

2

エイリアスを実行するシェルが直接実行するので、該当する場合は機能を優先します。 sh -c '...'を使用すると、まだの別のプロセスが開始されます。

+0

クールな、カジュアルなユーザーのためだけに、これだけで十分でしょう – henry

関連する問題