【问题标题】:Search output of p4 commandp4 命令的搜索输出
【发布时间】:2017-12-04 14:27:08
【问题描述】:

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

【问题讨论】:

  • 也检查 STDERR:p4 sync -n $HOME/... 2>&1 | grep -c up
  • 它给出输出“不明确的输出重定向”。
  • 类似的输出:p4 sync -n $HOME/... >& | grep -c up “不明确的输出重定向。”。我注意到,当您检查历史记录时,它似乎在 > 和 & 之间随机添加了一个空格。 "p4 sync -n $HOME/... > & | grep -c up"

标签: linux grep perforce csh


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多