仅当作业数大于 0 时才显示作业数

San*_*mar 7 bash

我有一个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空间。我想要的是,如果stoppedrunning值中的任何一个大于0那么才会出现。

man*_*ork 6

首先,我建议修复您的报价。从命令提示符独立运行时,当前函数不会输出有用的数据。

然后使用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)

我还建议添加-pjobs调用中,以便它们仅输出进程 PID。否则yes $'foo\nbar' &,在 2 行中列出的命令将被计算两次。


Mat*_*nte 6

你们把这种方式弄得太复杂了。只需检查输出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)


l0b*_*0b0 1

我使用它的变体仅在退出代码非零时显示退出代码

PS1=' \w $(running=$(jobscount); [ "${running:-0}" -eq 0 ] || printf %s "$running") \$ '
Run Code Online (Sandbox Code Playgroud)

每次显示提示时都会运行里面的代码。