Como você está executando isso a cada solicitação, vale a pena salvar algumas chamadas externas.
Para mostrar a contagem apenas se houver trabalhos em segundo plano, verifique os números e não imprima nada se eles forem todos 0.
Executar jobs -p
para obter apenas os IDs do processo, é mais fácil analisar de forma confiável.
jobscount() {
set -- $(jobs -rp)
set $# $(jobs -sp)
set $1 $(($#-1))
if [ $1 -ne 0 ] || [ $2 -ne 0 ]; then echo "${1}r/${2}s"; fi
}
PS1=' \w $(jobscount) \$ '
A propósito, observe as aspas ao redor do lado direito ao atribuir a PS1
. Com aspas duplas, a função é chamada quando você define a variável. Você precisa usar aspas simples, para que o valor de PS1
contenha o texto $(jobscount)
e a função seja chamada toda vez que o prompt for exibido.
Você pode salvar um fork usando PROMPT_COMMAND
para definir uma variável em vez de usar a saída de uma função.
set_jobscount () {
set $(jobs -rp)
set $# $(jobs -sp)
set $1 $(($#-1))
if [ $1 -ne 0 ] || [ $2 -ne 0 ]; then
jobscount="${1}r/${2}s"
else
jobscount=
fi
}
PROMPT_COMMAND="$PROMPT_COMMAND
set_jobscount"
PS1=' \w ${jobscount} \$ '
Como de costume, é mais simples (se parecer críptico) em zsh.
precmd () {
jobscount=${(M)#${jobstates%%:*}:#running}r/${(M)#${jobstates%%:*}:#suspended}s
if [[ $jobscount == r0/s0 ]]; then jobscount=; fi
}
setopt prompt_subst
PS1='… ${jobscount} …'
Aqui jobstates
é variável fornecida por Zsh de zsh/parameter
. #running
e #suspended
separam a saída para incluir apenas os trabalhos em execução ou suspensos. (M)
flag e %%
são da expansão de parâmetros . (M)
flag remove os elementos não correspondentes e %%
exclui qualquer coisa depois de :
da saída de $jobstates