Zsh
如何在作業命令的輸出中擴展變數
正如您在以下輸出中看到的那樣,輸出中的變數
$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
乾杯!
請注意,它不是您放在前台的程序
sleep 10 | sleep 20 &
,而是由 shell 命令組成的作業,該命令可以是一個複合命令,可以並行啟動多個程序(如 in )或一個接一個(如 infor i in {1..10}; do sleep $i; done &
)。並且這些程序中的每一個都可以依次啟動更多程序(這仍然是工作的一部分,但
zsh
不知道不是直接後代)或者可以更改他們報告的參數列表ps
(比如在sh -c 'exec env sleep 10'
其中執行一個執行的程序sh
,然後env
,然後sleep
都在同一個流程中)或者可以離開工作(通過成為新的流程組負責人)。聽起來對於每個作業,您都希望查看該作業中程序的 arg 列表。
也許是這樣的:
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