我有一个jobscount()功能:
jobscount() {
local stopped='$(jobs -s | wc -l | tr -d " ")'
local running='$(jobs -r | wc -l | tr -d " ")'
echo -n "${running}r/${stopped}s"
}
Run Code Online (Sandbox Code Playgroud)
我在我的$PS1:
PS1=" \w $(jobscount) \$ "
Run Code Online (Sandbox Code Playgroud)
唯一的问题是如果没有后台进程在运行或没有停止的作业,这个功能会无用地占用$PS1空间。我想要的是,如果stopped或running值中的任何一个大于0,那么它才会出现。
首先,我建议修复您的报价。从命令提示符独立运行时,当前函数不会输出有用的数据。
然后使用OR 列表分隔符在 之前添加一个条件echo:
jobscount() {
local stopped=$(jobs -sp | wc -l)
local running=$(jobs -rp | wc -l)
((running+stopped)) && echo -n "${running}r/${stopped}s "
}
PS1=' \w $(jobscount)\$ '
Run Code Online (Sandbox Code Playgroud)
我还建议添加-p到jobs调用中,以便它们仅输出进程 PID。否则yes $'foo\nbar' &,在 2 行中列出的命令将被计算两次。
你们把这种方式弄得太复杂了。只需检查输出jobs是否为非空,然后添加\j到您的 PS1 字符串。
if [ -n "$(jobs -p)" ]; then echo "\j"; fi
Run Code Online (Sandbox Code Playgroud)
这是我的提示中的一个片段:
#Show number of jobs if at least one job
export PS1+='`if [ -n "$(jobs -p)" ]; then echo "(\j)"; fi`'
Run Code Online (Sandbox Code Playgroud)
我使用它的变体仅在退出代码非零时显示退出代码:
PS1=' \w $(running=$(jobscount); [ "${running:-0}" -eq 0 ] || printf %s "$running") \$ '
Run Code Online (Sandbox Code Playgroud)
每次显示提示时都会运行里面的代码。