web-dev-qa-db-ja.com

BashでのPIDとjobspecの使用に重複はありますか?

BashでのPIDとjobspecの使用に重複はありますか?

私のスクリプトでは、$!を使用してコマンドのPIDを変数に格納します。次に、PIDを指定してdisownを呼び出し、シェルのアクティブなジョブテーブルからジョブを削除します。後で、スクリプトは状況に応じてkillを使用してプロセスを強制終了する場合としない場合があります。これの目的は、見苦しい「ジョブが強制終了されました」というメッセージが端末に表示されないようにし、スクリプトのすっきりとした出力が見苦しく見えるようにすることです。

正常に動作しますが、PIDとjobspecの違いに混乱しています...

$! - the PID of the most recent background command.
disown [-ar] [-h] [jobspec ...]
kill [-s sigspec | -n signum | -sigspec] [pid | jobspec]

disownにはjobspecが必要ですが、PIDを指定しています。 man bashは、jobspecが有効なジョブを指定しない限り、disownは0を返すことを示しています。 PIDを指定すると、0が返されるので、すべて問題ないようです。

man bashでjobspecを検索しても、一般にjobspecの代わりにPIDを使用できることは言及されておらず、disownエントリはjobspecの代わりにPIDを使用できることを示していません。

PIDとjobspecは同じものではありませんが、それらの使用に重複はありますか?そうでない場合、なぜ私のコードは機能するのですか? disownがjobspecの代わりにPIDを取得できるのと同じくらい簡単で、これはman bashに文書化されていませんか?

ありがとう。

[〜#〜]編集[〜#〜]

chorobaは正しいですが、disownがjobspecの代わりにPIDを取得できることは、disownの文書化されていない機能のようです。これを2つの異なるバージョンのGNU Bashでのテストで確認しました。

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) [On Linux Mint]
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) [On Debian]

GNU(私が知る限り)では文書化されていませんが、Linux Documentation Projectの ジョブ制御コマンド ページの3番目の文に文書化されています。

GNU Bashのmanページのメンテナーに、シェルの組み込みコマンドセクションのdisownエントリを変更するように提案するメールを送りました。

From: disown [-ar] [-h] [jobspec ...]
To:   disown [-ar] [-h] [jobspec | pid] ...

彼はエラーを確認し、変更を加えました。

4
mattst

disownの文書化されていない機能のようです。 jobspecは常に%で始まるため、BashはPIDをjobspecと間違えることはありません。

2
choroba