これら2つのプロセスは次のとおりです。
cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &
バックグラウンドで実行する必要がありますが、2番目のタスクをフォアグラウンドにインポートすることはできません。
答え1
これが2つの一般的なジョブの場合、aa plainはfg
2番目のジョブをフォアグラウンドにインポートします(これが最近一時停止されたバックグラウンドジョブ、または最近開始されたバックグラウンドジョブの場合(他のジョブは一時停止されません))。
ただし、最初の操作(読み取り)の性質により、/dev/tty
TTYで読み取りを試みるとすぐに停止します。fg
したがって、それはなりますそれフロントデスクに戻ります。
他の仕事がないことを考えると、ここで解決策は%-
orを使用することです。%2
ジョブがバックグラウンドに切り替わると(終了コマンドを使用してジョブを開始するか、フォアグラウンドジョブの一時停止を使用してコマンドを&
実行Ctrl+Zして)、ジョブbg
に「ジョブID」または「ジョブ仕様」が表示されます。このジョブIDは通常、小数点以下の桁数%N
で表されます。N
wait
などの複数のコマンドでジョブIDを使用できますkill
。たとえば、このコマンドは、ジョブIDを使用してバックグラウンドジョブにシグナルを送信するために使用できます。fg
bg
kill
デフォルトでは、このfg
コマンドは「現在の操作」に適用されます。現在のジョブのジョブIDは、または%+
で取得できます%%
。現在のジョブは、直前に開始されたバックグラウンドジョブ、または中断されたジョブがある場合は、最新の中断されたジョブです。
バックグラウンドジョブをフォアグラウンドに移動するには、対応するジョブIDを使用してください。
$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
$ fg %1
sleep 1000
出力+
でjobs
「現在の作業」を意味します(簡単な呼び出しに切り替えた作業ですfg
)。
POSIX標準特殊ジョブID:
%%
、現在の職業。%+
、のような上記と。%-
、以前の職業。%N
、ジョブ番号N
。%string
、コマンドがで始まるタスクstring
。%?string
、コマンドに含まれる操作ですstring
。
答え2
fg
コマンドを試してみましたか?
fg %2
答え3
whileには$!
プロセスIDが含まれています。最高最近バックグラウンドで開始された作業プロセスを把握することは困難です。働く確実な方法でIDを確認してください。
ジョブIDは再利用されるため、必ずしも最大のジョブIDである必要はありません。保留中のジョブが優先順位を持つため、参照できるジョブである必要はありません(または引数なしでジョブが実行されます)(あなたの場合、最初のジョブが%%
代わり%+
にfg
ttyから読み取ろうとしているので中断することができます)。または、最後に開始されたジョブが終了した可能性があります(この場合、リスト%+
の次のジョブが参照されます)。
jobs
したがって、目的のジョブのジョブ番号を知るために最初に実行する必要がありますfg
(useを使用)、fg %thatnumber
名前に他のジョブがない場合は、次のように実行する必要があります。zero
fg %\?zero
これにより、以下をzsh
使用できます。
fg_most_recent() {
local job=${(k)jobstates[(R)*:$!=*]}
((job)) && fg %$job
}
つまり、値がパターンに一致する連想配列を取得しますk
(直接開始されたジョブのすべてのプロセス状態を提供するようです)。$jobstates
*:$!=*
$jobstates
running:+:20162=running:20163=running
zsh