Necesito hacer algo como:
while true do if ss --tcp --processes | grep 53501 ; then <save result to /tmp/cmd.out> ; fi doneEs intrínsecamente imposible hacer exactamente esto, porque un comando (o una canalización de comandos) produce una salida a medida que se ejecuta, pero no produce un estado de salida (éxito/falla) hasta que termina de ejecutarse; por lo tanto, no puede decidir si desea guardar la salida o no hasta que ya haya terminado de generarse.
Lo que puede hacer es almacenar la salida en algún lugar temporal y luego guardarla o no. No estoy seguro de si esto es exactamente lo que está tratando de hacer, pero tal vez algo como esto (usando una variable como almacenamiento temporal):
while true do output=$(ss --tcp --processes | grep 53501) if [ -n "$output" ]; then echo "$output" >/tmp/cmd.out fi doneEl ciclo while parece peligroso, eventualmente se quedará sin espacio en disco.
while true do ss --tcp --processes | grep 53501 &>> /tmp/cmd.out sleep 1 echo "Careful about using while true without any sleep" done &>> canaliza y agrega todo STDERR y STDOUT al archivo, naturalmente, la salida no será nada si grep no encuentra nada.