搜索p4命令的输出

时间:2017-12-04 14:27:08

标签: linux grep perforce csh

我正在尝试根据perforce命令的输出执行操作。但似乎pipping和greping / acking命令似乎没有拾取输出

e.g。

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 个答案:

答案 0 :(得分:3)

grep无效,因为no such fileup-to-date等“空”消息转到stderr。正如@heemayl建议的一种解决方法是进行重定向。

您还可以使用-s-e标记p4以与shell无关的方式解决此问题:

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作为其唯一代码而不是字符串。

使用-F标志可以重新格式化输出,以包含您使用-e看到的消息字典中的特定元素,因此,如果您只想要代码:

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

如果您尝试捕获实际输出的元素,例如文件名,-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