No meu servidor remoto com bash 4.2.46, posso fazer isso:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646
No entanto, no meu Mac com bash 3.2.57, não funciona:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found
O que está acontecendo? De alguma forma, uso o macOS bash
há anos sem nunca ter enfrentado esse problema antes... mas juro que executei muitos programas shell que fazem esse $!
método exato para obter o ID do processo em segundo plano e nunca o quebrou.
Responder1
O !
é o caractere de gatilho paraexpansão da história, habilitado em shells interativos por padrão.
Eu não acho que isso faria algo útil pid=$!;
como no seu caso, ou em echo "$!"
. Como você pode ver na mensagem de erro, ele tenta usar uma string vazia para procurar, em vez de algo como !foo
procurar foo
. As versões mais recentes do Bash são mais sensatas $!
ou "!"
não o acionam, mas o 3.2 é um pouco estúpido com isso.
O que parece funcionar é pid=$! ;
, com o espaço antes do ponto e vírgula. Ou você pode simplesmente desativar a expansão do histórico com set +H
. (Observe que"$!"
nãotrabalhe em 3.2.)