Mostrar tarefas conta apenas se for maior que 0

5

Eu tenho uma função jobscount() :

jobscount() {
   local stopped='$(jobs -s | wc -l | tr -d " ")'
   local running='$(jobs -r | wc -l | tr -d " ")'
   echo -n "${running}r/${stopped}s"
}

Eu uso essa função no meu $PS1 :

PS1=" \w $(jobscount) \$ "

O único problema é que, se não houver nenhum processo em segundo plano em execução ou se não houver trabalhos interrompidos, essa função ocupará, sem utilidade, $PS1 space. O que eu quero é se um dos valores stopped ou running for maior que 0 , somente então será exibido.

    
por Santosh Kumar 20.03.2013 / 16:31

5 respostas

6

Antes de tudo, sugiro que você corrija suas citações. Sua função atual não produz dados úteis quando executada de maneira independente no prompt de comando.

Em seguida, adicione uma condição usando o separador OU antes do 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)\$ '

Sugiro também adicionar -p às chamadas jobs , para que elas produzam somente PIDs de processo. Caso contrário, um comando yes $'foo\nbar' & , listado em duas linhas, seria contado duas vezes.

    
por 20.03.2013 / 16:39
3

Vocês estão fazendo isso muito complicado. Apenas verifique se a saída de jobs não está vazia e adicione \j à sua string PS1.

if [ -n "$(jobs -p)" ]; then echo "\j"; fi

Aqui está um trecho do meu prompt:

#Show number of jobs if at least one job
export PS1+=''if [ -n "$(jobs -p)" ]; then echo "(\j)"; fi''
    
por 17.06.2017 / 22:22
3

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

    
por 21.03.2013 / 01:53
1

Estou usando uma variante disso para mostrar o código de saída somente se for diferente de zero :

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

O código interno será executado toda vez que o prompt for exibido.

    
por 20.03.2013 / 16:37
0

como cerca de $ () no PS1, como:

export PS1='\w $(if test "\j" -ne "0"; then echo -e "3[32m\j "; fi )\[3[01;35m\]\$\[3[00m\] '
    
por 16.03.2017 / 17:50

Tags