linux - p4 命令的搜索输出

标签 linux grep perforce csh

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

例如

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 命令的输出而不必写入文件然后读取输出?理想情况下,该命令是一行。

最佳答案

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

这两个标志都将所有输出重定向到标准输出,并且还在每条消息前面加上关于消息本身的调试信息。例如,如果您尝试对特定消息进行 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

关于linux - p4 命令的搜索输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47635518/

相关文章:

regex - 使用 grep 或其他方式匹配数字 1 而不是 10 或 11

bash - grep:参数列表太长

perforce - P4V : Automatically Integrating Changes Changelist-By-Changelist Using Branch Mapping

c++ - 了解动态链接在 UNIX 上的工作原理

linux - 当我以标准用户身份运行它时,我可以将 lshw 警告通过管道传输到/dev/null 吗?

c++ - Qt5 未注册触摸事件

c - fork 一个 child 并调用 gcc

bash - 从字符串中删除所有不是数字的字符

versioning - Perforce - 如何放弃整个文件夹的更改?

perforce - 在Perforce中,如何查找具有特定文件类型+属性的文件?