$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
请注意,这不是流程您将作业放在前台,但作业由 shell 命令组成,该命令可以是并行启动多个进程的复合命令(如 中sleep 10 | sleep 20 &
)或一个接一个地启动(如 中for i in {1..10}; do sleep $i; done &
)。
这些进程中的每一个都可以依次启动更多进程(这仍然是作业的一部分,但不知道因为zsh
不是直接后代),或者可以更改其报告的参数列表ps
(例如sh -c 'exec env sleep 10'
运行一个执行sh
, then 的进程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