web-dev-qa-db-ja.com

シェルスクリプトでjobsコマンドが機能しないのはなぜですか?

実行した場合jobs -lコマンドプロンプトで実行中のジョブのステータスが表示されますが、ファイル./tmp.shの下で実行すると

#! /bin/bash
jobs -l

空の出力が表示されます。

それはなぜですか。また、シェルスクリプト内の特定のジョブのステータスに関する情報を取得するにはどうすればよいですか。

4
user13107

jobs

ジョブを表示します 現在のシェルによって管理されています 。スクリプトは独自のシェル内で実行されるため、jobsにはスクリプトのシェルによって管理されているジョブのみが表示されます...

これが実際に動作することを確認するには、

#!/bin/bash
sleep 60 &
jobs -l

シェルスクリプトの前に開始された「ジョブ」に関する情報を表示するには、スクリプト内でそれらを通常のプロセスのように扱い、psなどを使用する必要があります。親シェル(シェル)によって開始されたプロセスに制限できます。スクリプト内で$PPID変数を使用し、同じ親PIDを共有するプロセスを探すことにより、スクリプトが開始された場所(存在する場合)。

5
Stephen Kitt

スティーブンが言ったように、新しいシェルをスポーンすることはおそらくあなたがやりたいことではありません。 現在のシェルでコードを実行する必要があります。

コードは、source myscript.shを実行するか、 関数 (bashrcまたはソースとなる別のファイルにある可能性があります)でコードを宣言することで機能します。

myfunction () {
  jobs -l
} 

興味があれば、これを my dotfiles で使用しました。

1
jasonszhao