0보다 큰 경우에만 작업 수 표시

0보다 큰 경우에만 작업 수 표시

나는 jobscount()기능이 있습니다 :

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

내에서는 이 기능을 사용합니다 $PS1.

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

유일한 문제는 실행 중인 백그라운드 프로세스가 없거나 중지된 작업이 없으면 해당 기능이 $PS1쓸데없이 공간을 차지한다는 것입니다. 내가 원하는 것은 or stoppedrunning0,그때야나타난다.

답변1

이 방법을 너무 복잡하게 만들었습니다. 출력이 jobs비어 있지 않은지 확인하고 \jPS1 문자열에 추가하십시오.

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

내 프롬프트의 일부는 다음과 같습니다.

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

답변2

먼저 견적을 수정하는 것이 좋습니다. 현재 함수는 명령 프롬프트에서 독립 실행형으로 실행될 때 유용한 데이터를 출력하지 않습니다.

그런 다음 다음을 사용하여 조건을 추가합니다.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)\$ '

또한 프로세스 PID만 출력하도록 호출을 -p추가 하는 것이 좋습니다 . jobs그렇지 않으면 yes $'foo\nbar' &2행에 나열된 명령이 두 번 계산됩니다.

답변3

메시지가 나타날 때마다 이 명령을 실행하므로 일부 외부 호출을 저장하는 것이 좋습니다.

백그라운드 작업이 있을 때만 개수를 표시하려면 개수를 확인하고 모두 0이면 아무것도 인쇄하지 마세요.

Run은 jobs -p프로세스 ID만 가져오므로 안정적으로 구문 분석하기가 더 쉽습니다.

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) \$ '

그런데 에 할당할 때 오른쪽에 있는 따옴표를 참고하세요 PS1. 큰따옴표를 사용하면 변수를 설정할 때 함수가 호출됩니다. 값에 PS1텍스트가 포함되고 $(jobscount)프롬프트가 표시될 때마다 함수가 호출되도록 작은따옴표를 사용해야 합니다 .

PROMPT_COMMAND함수의 출력을 사용하는 대신 변수를 설정하여 포크를 저장할 수 있습니다 .

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} \$ '

늘 그렇듯이 zsh는 더 간단합니다(비록 신비해 보이지만).

precmd () {
  jobscount=${(M)#${jobstates%%:*}:#running}r/${(M)#${jobstates%%:*}:#suspended}s
  if [[ $jobscount == r0/s0 ]]; then jobscount=; fi
}
setopt prompt_subst
PS1='… ${jobscount} …'

여기jobstatesZsh에서 제공하는 변수는 다음에서 유래합니다.zsh/parameter기준 치수. 실행 중이거나 보류 중인 작업만 포함하도록 출력을 분리합니다 #running. 로고 와#suspended(M)%%매개변수 확장. (M)플래그는 일치하지 않는 요소를 제거하고 그 이후의 모든 요소를 ​​출력에서 %%​​제거합니다 .:$jobstates

답변4

예를 들어, PS1의 $()는 어떻습니까?

export PS1='\w $(if test "\j" -ne "0"; then echo -e "\033[32m\j "; fi )\[\033[01;35m\]\$\[\033[00m\] '

관련 정보