2017-12-04 22 views
0

PERFORCEコマンドの出力に応じてアクションを実行しようとしています。しかし、コマンドをピッキングし、greping/ackingが出力をピックアップするように見えないようです。p4コマンドの出力の検索

p4 sync -n $HOME/... | grep -c up 
/homedirectory/... - file(s) up-to-date. 
0 

p4 sync -n $HOME/... | grep -c nope 
/homedirectory/... - file(s) up-to-date. 
0 

私は何をしようとしているの更なる例:

if (`p4 sync -n $HOME/... | grep -c "no such file"` == 0) then 
    if command 
else 
    do else command 
endif 

、出力を読み、ファイルに記述することなく、PERFORCEコマンドの出力を読み取ることがとにかくありますか?理想的には、コマンドは1行になります。 no such fileup-to-dateのような「空の」メッセージが標準エラーになるため、

+1

チェックSTDERR: 'P4同期の$ HOME -n/... 2>&1 | grep -c up' – heemayl

+0

出力に「あいまいな出力リダイレクト」を与えます。 – difurious

+0

同様の出力: p4 sync -n $ HOME/...>&| grep -c up "あいまいな出力リダイレクト"。 あなたの履歴を確認すると、>と&の間にスペースがランダムに追加されているように見えます。 "p4 sync -n $ HOME/...>&| grep -c up" – difurious

答えて

3

grepは機能しません。 @heemaylは、リダイレクトを行うことを修正する方法を提案しました。

またp4-sまたは-eのフラグを使用して、シェルに依存しない方法でこの問題を解決することができます

C:\Perforce\test>p4 -s sync 
error: File(s) up-to-date. 
exit: 0 

C:\Perforce\test>p4 -e sync 
error: File(s) up-to-date. 
code0 554768772 (sub 388 sys 6 gen 17 args 1 sev 2 uniq 6532) 
... code0 554768772 
... fmt0 [%argc% - file(s)|File(s)] up-to-date. 
... argc 

exit: 0 

は、これらのフラグの両方がstdoutにすべての出力をリダイレクトしても、デバッグ情報を持つすべてのメッセージを付加しましたメッセージそのもの。たとえば、特定のメッセージに対してgrepを実行しようとしている場合は、-eフラグとgrepを文字列ではなく固有のコードに使用できます。あなたは要素を捕獲しようとしている場合

C:\Perforce\test>p4 -F %code0% sync 
554768772 

-Fフラグを使用して

は、あなたがあなただけのコードをしたいので、もし、あなたが-eで見たメッセージのdictから特定の要素が含まれるように、出力を再フォーマットすることができます実際の出力の、ファイル名のように、-Fがさらに便利である:あまりにも

C:\Perforce\test>p4 -F %localPath% sync -n ...#1 
c:\Perforce\test\0.f1 
c:\Perforce\test\1.15 
c:\Perforce\test\1.18 
c:\Perforce\test\2.f1 
c:\Perforce\test\2.f2