![bash 3.2.57 で $! からプロセス ID を取得できません](https://rvso.com/image/170647/bash%203.2.57%20%E3%81%A7%20%24!%20%E3%81%8B%E3%82%89%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%20ID%20%E3%82%92%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93.png)
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 で動作します。