Em:
cmd1 | cmd2
A maioria das shells (shell Bourne, (t) csh, assim como yash e algumas versões do AT & T ksh, sob algumas condições, são exceções notáveis), aguarde tanto cmd1
como cmd2
.
Em bash
, você notará que
sleep 1 | uname
retorna após um segundo.
Em:
btmon | grep -m 1 '@ Device Disconnected'
grep
sairá assim que encontrar uma ocorrência do padrão, mas bash
ainda aguardará btmon
.
btmon
normalmente morrerá de um SIGPIPE da próxima vez que gravar no pipe após grep
ter retornado, mas se ele nunca escrever nada novamente, ele nunca receberá esse sinal.
Você pode substituir #! /bin/bash
por #! /bin/ksh93
, pois esse é um shell compatível com bash
e um que aguarda apenas o último componente de um pipeline. Então em
btmon | grep -m 1 '@ Device Disconnected'
depois que grep
retornar, btmon
seria executado em segundo plano e o shell continuaria com o restante do script.
Se você quisesse matar btmon
assim que grep
retornasse, POSIXly, você poderia fazer algo como:
sh -c 'echo "$$"; exec btmon' | (
read pid
grep -m1 '@ Device Disconnected' || exit
kill "$pid" 2> /dev/null
true)