$i
以下の出力に示すように、出力の変数は背中に展開ps aux
されますsleep 1
。同じことをするsleep 2
方法はありますか?出力zsh
では、すべてのコマンドの名前は同じです(例:。jobs
sleep $i
$ for i in {1..10}; do sleep $i& done; ps aux | grep sleep; jobs
[6] 1630
[7] 1631
[8] 1632
[9] 1633
[10] 1634
[11] 1635
[12] 1636
[13] 1637
[14] 1638
[15] 1639
root 1630 0.0 0.0 5224 684 pts/3 SN 10:06 0:00 sleep 1
root 1631 0.0 0.0 5224 684 pts/3 SN 10:06 0:00 sleep 2
root 1632 0.0 0.0 5224 744 pts/3 SN 10:06 0:00 sleep 3
root 1633 0.0 0.0 5224 744 pts/3 SN 10:06 0:00 sleep 4
root 1634 0.0 0.0 5224 748 pts/3 SN 10:06 0:00 sleep 5
root 1635 0.0 0.0 5224 752 pts/3 SN 10:06 0:00 sleep 6
root 1636 0.0 0.0 5224 680 pts/3 SN 10:06 0:00 sleep 7
root 1637 0.0 0.0 5224 748 pts/3 SN 10:06 0:00 sleep 8
root 1638 0.0 0.0 5224 748 pts/3 SN 10:06 0:00 sleep 9
root 1639 0.0 0.0 5224 748 pts/3 SN 10:06 0:00 sleep 10
root 1641 0.0 0.0 6144 880 pts/3 S+ 10:06 0:00 grep --color=auto sleep
[6] running sleep $i
[7] running sleep $i
[8] running sleep $i
[9] running sleep $i
[10] running sleep $i
[11] running sleep $i
[12] running sleep $i
[13] running sleep $i
[14] - running sleep $i
[15] + running sleep $i
乾杯!
答え1
そうではありませんので参考にしてくださいプロセスジョブはフォアグラウンドに配置されますが、ジョブはシェルコマンドで構成されます。このコマンドは、複数のプロセスを並列に( のようにsleep 10 | sleep 20 &
)開始するか、順番に( のようにfor i in {1..10}; do sleep $i; done &
)開始する複合コマンドです。
これらの各プロセスは、次に、より多くのプロセスを開始するか(まだタスクの一部ですがzsh
直系の子孫ではないため不明)、レポートするパラメータのリストを変更できますps
(たとえば、そのプロセスをsh -c 'exec env sleep 10'
実行してから、両方とも同じプロセスから)または可能です。sh
env
sleep
去る職業(新しいプロセスグループリーダーになる)。
各ジョブについて、そのジョブのプロセスのパラメーターのリストを表示したいように聞こえます。
たぶん、次のようなものがあります。
for job state ("${(@kv)jobstates}") {
pgid=${${state%%=*}##*:}
echo Job $job:
pgrep -ag $pgid
}
あなたの例では、次のようなものを提供します。
Job 2:
26590 sleep 1
Job 3:
26591 sleep 2
Job 4:
26592 sleep 3
Job 5:
26593 sleep 4
Job 6:
26594 sleep 5
Job 7:
26595 sleep 6
Job 8:
26596 sleep 7
Job 9:
26597 sleep 8
Job 10:
26598 sleep 9
Job 11:
26599 sleep 10