11.6. 停止的作业计数

Torben Fjerdingstad () 写信告诉我,他经常停止作业,然后忘记它们。他使用提示符来提醒自己停止的作业。 显然,这非常流行,因为从 Bash 2.04 开始,有一个标准的转义序列用于 shell 管理的作业

[giles@zinfandel]$ export PS1='\W[\j]\$ '
giles[0]$ man ls &
[1] 31899
giles[1]$ xman &
[2] 31907

[1]+  Stopped                 man ls
giles[2]$ jobs
[1]+  Stopped                 man ls
[2]-  Running                 xman &
giles[2]$

请注意,这会显示停止和正在运行的作业。 在控制台中,您可能需要完整的计数,但在 xterm 中,您可能只对停止的作业感兴趣。 要仅显示这些作业,您可以像下面这样使用

[giles@zinfandel]$ function stoppedjobs {
-- jobs -s | wc -l | sed -e "s/ //g"
-- }
[giles@zinfandel]$ export PS1='\W[`stoppedjobs`]\$ '
giles[0]$ jobs
giles[0]$ man ls &
[1] 32212

[1]+  Stopped                 man ls
giles[0]$ man X &
[2] 32225

[2]+  Stopped                 man X
giles[2]$ jobs
[1]-  Stopped                 man ls
[2]+  Stopped                 man X
giles[2]$ xman &
[3] 32246
giles[2]$ sleep 300 &
[4] 32255
giles[2]$ jobs
[1]-  Stopped                 man ls
[2]+  Stopped                 man X
[3]   Running                 xman &
[4]   Running                 sleep 300 &

这并不总是在命令执行后紧随其后的提示符中显示停止的作业 - 这可能取决于作业是否在 jobs 运行之前启动并放入后台。

Note

Bash 2.02 中存在一个已知的错误,该错误导致 jobs 命令(一个 shell 内置命令)不会向管道返回任何内容。 如果您在 Bash 2.02 下尝试上述操作,无论您停止了多少作业,您都将始终获得“0”返回。 此问题已在 2.03 中修复。

相对速度:'jobs -s | wc -l | sed -e "s/ //g" ' 在未加载的 486SX25 上大约需要 0.24 秒。