Skip to content
Advertisement

Search output of p4 command

I am trying to perform an action depending on the output of perforce commands. But it seems that pipping and greping/acking the command doesn’t appear to pickup the output

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

Further example of what i’m trying to do:

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

Is there anyway to read the output of a perforce command without having to write to a file then read the output? Ideally the command would be a single line.

Advertisement

Answer

grep isn’t working because the “empty” messages like no such file and up-to-date go to stderr. As @heemayl suggested one way to fix that is to do a redirect.

You can also fix this in a shell-independent way by using the -s or -e flags to p4:

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

C:Perforcetest>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

Both of these flags redirect all output to stdout and also prepend every message with debugging information about the message itself. If you’re trying to grep for a particular message, for example, you can use the -e flag and grep for its unique code rather than the string.

Using the -F flag lets you reformat the output to include particular elements from the message dict that you see with -e, so if you want just the code:

C:Perforcetest>p4 -F %code0% sync
554768772

If you’re trying to capture elements of the actual output, like file names, -F is even more useful:

C:Perforcetest>p4 -F %localPath% sync -n ...#1
c:Perforcetest.f1
c:Perforcetest1.15
c:Perforcetest1.18
c:Perforcetest2.f1
c:Perforcetest2.f2
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement