Não foi possível capturar o ID do processo de $! na festança 3.2.57

Não foi possível capturar o ID do processo de $! na festança 3.2.57

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 bashhá 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 !fooprocurar 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.)

informação relacionada