代码之家  ›  专栏  ›  技术社区  ›  difurious

p4命令的搜索输出

  •  1
  • difurious  · 技术社区  · 7 年前

    我试图根据perforce命令的输出执行一个操作。但是,对命令执行piping和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命令的输出而不必写入文件,然后读取输出?理想情况下,命令应为单行。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Samwise    7 年前

    grep 因为“空”消息 no such file up-to-date 转到stderr。正如@heemayl所建议的,解决这个问题的一种方法是重定向。

    您还可以通过使用 -s -e 标志到 p4 :

    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 flag和grep的唯一代码,而不是字符串。

    使用 -F 标志使您可以重新格式化输出,以包括您看到的消息dict中的特定元素 -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