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
どうしたの?どういうわけか私は何年もmacOSを使用してきましたが、これまで何も起こりませんでした...しかし、誓うと、バックグラウンドプロセスのプロセスIDを取得するbash
正確な方法を実行する多くのシェルプログラムを実行しました。$!
壊れる。
答え1
!
トリガーキャラクターです歴史的拡張、対話型シェルでデフォルトで有効になっています。
あなたのpid=$!;
場合、私はecho "$!"
トリガーしますが、3.2はこの点で少し愚かです。!foo
foo
$!
"!"
動作しているように見えるのは、pid=$! ;
セミコロンの前にスペースがあることです。または、履歴無効化拡張を使用することもできますset +H
。 (知っている"$!"
いいえ3.2で動作します。 )