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 で動作します。