bash 3.2.57 で $! からプロセス ID を取得できません

bash 3.2.57 で $! からプロセス ID を取得できません

bash 4.2.46 を搭載したリモート サーバーでは、次の操作を実行できます。

$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646

しかし、bash 3.2.57 を搭載した私の Mac では動作しません。

$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found

何が起こっているのでしょうか? どういうわけか、私はbashこれまでこの問題に遭遇することなく何年も macOS を使ってきました... しかし、バックグラウンド プロセスのプロセス ID を取得するためにまさにこの方法を実行するシェル プログラムをたくさん実行しました$!が、一度も壊れたことはありませんでした。

答え1

!歴史の拡大対話型シェルではデフォルトで有効になっています。

pid=$!;あなたの場合や の場合のように、では何も役に立たないと思いますecho "$!"。エラー メッセージからわかるように、 を!foo検索するのではなく、空の文字列を使用して を検索しようとしますfoo。Bash の新しいバージョンでは、その点がより合理的である$!か、"!"それをトリガーしませんが、3.2 ではその点が少し愚かです。

うまくいくと思われるのはpid=$! ;、セミコロンの前にスペースを置くことです。または、 で履歴展開を無効にすることもできますset +H。("$!" しない3.2 で動作します。

関連情報