Você pode usar o utilitário xargs para isso. Ele pode executar um comando para cada linha no stdin, portanto, precisamos garantir que xargs receba como entrada uma única linha no stdin no momento em que deve iniciar o comando, o que pode ser realizado com grep :
proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2
Os argumentos --max-count=1 , --max-lines=1 e --no-run-if-empty garantem que proc2 seja iniciado exatamente uma vez se e quando proc1 produzir ${targetString} pela primeira vez e nunca se proc1 nunca produzir ${targetString} .
O --replace evita que xargs acrescente a linha de entrada à sua linha de comando.
Eu usei a seguinte linha de comando para testá-lo:
(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"