나는 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 stopped
값 running
이 0
,그때야나타난다.
답변1
이 방법을 너무 복잡하게 만들었습니다. 출력이 jobs
비어 있지 않은지 확인하고 \j
PS1 문자열에 추가하십시오.
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} …'
여기jobstates
Zsh에서 제공하는 변수는 다음에서 유래합니다.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\] '