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