2

git 用の「カスタム grep」ラッパーを開発しています。ファイル マッチング パターンの最初の行が表示されます。この行は、ファイルのヘッダーであると予想されます。

エイリアスを作成しましたが、作業フォルダーに見つからないパターンを検索するまではすべて問題ありませんでした。ファイルが見つからなかったためheadsedコマンドは処理するものがなく、コマンドを渡して入力を待ちます。

これを防ぐ方法は?入力がない場合、スクリプトを中断したいと思います。確かに、別のスクリプトを作成し、ファイルのリストを変数に割り当てて、この変数の長さを確認することができました。しかし、私は甘くてきちんとした oneliner-alias を好みます。

出来ますか?ここに私の.gitconfigエイリアスセクションがあります:

[alias] 
    gg = !sh -c 'head -n1 -q `git grep --name-only $0` | sed s/OBJECT.//'

解像度

エイリアスの次のコマンドは、Windows 7 x64、msysGit 1.7.11.1 で機能しました。

gg = !sh -c 'head -n1 -q `git grep --name-only $0` < /dev/null | sed s/OBJECT.//' 

gg = !sh -c 'git grep --name-only $0 | xargs -l sed -n "1{s/OBJECT.//p}"'

でも性能は違いました。最初のアプローチは著しく高速です。

4

2 に答える 2

2

head存在しない入力を待って停止するのを防ぐ方法に関する当面の質問に対処するには、コマンド置換の代わりにプロセス置換を使用できます。

head -n1 -q <(git grep --name-only $0) | sed s/OBJECT.//

```cmd <(cmd)` 部分がコマンドの出力を含むファイル/パイプのファイル名に置き換えられるコマンド置換とは異なります。`` portion is replace by the output of the command, with process substitution the

コマンド出力が空の場合headでも、入力、つまり空のファイル/パイプのファイル名を受け取り、期待どおりに処理を進めます。

PSは、プロセス置換を使用するためにbash代わりに使用する必要があることに注意してください。sh

アップデート

お使いのバージョンの bash がプロセス置換をサポートしていない場合、問題を回避する別の方法として、空のファイルまたはダミー ファイルからコンテンツをリダイレクトすることができます。

head -n1 -q `git grep --name-only $0` < /dev/null | sed s/OBJECT.//

git grepあるいは、 which の出力をパイプするだけ で、 patthoyts answerに示されているように、またはxargsの呼び出しを連鎖させることができます。headsed

于 2012-07-24T10:29:30.190 に答える
2

頭は本当に必要ありません-sedはそれをすべて自分で行うことができます。

git grep --name-only $0 | sed -n "s/OBJECT.//;1p"

アップデート

OP は、git grep によって返された各ファイルの最初の行を読み取っています。

git grep --name-only $0 | xargs -l sed -n "1{s/OBJECT.//;p}"
于 2012-07-24T10:37:43.103 に答える