jobs
내 터미널 제목에 현재 상태가 표시되기를 원합니다 . Bash에서는 이것을 사용할 수 있습니다 PROMPT_COMMAND
. Korn Shell(ksh93)에는 이 기능이 없습니다.
다른 답변내부적으로 명령 대체를 사용하는 것이 좋습니다 $PS1
. 이는 일반적으로 잘 작동하지만 명령에는 작동하지 않습니다 jobs
. 여기서 문제는 jobs
직업에 대한 사람들의 걱정 이다.현재 쉘, 그러나 명령 대체(예: PS1='...$(jobs)...'
)는서브쉘, 그래서 취업 기회가 없습니다.
내가 아는 유일한 메커니즘은 이지만 trap '... jobs ...' DEBUG
이 작업은 너무 자주 수행됩니다. 현재 쉘의 컨텍스트에서 프롬프트당 한 번씩 명령을 실행하는 방법을 알고 있습니까? 아니면 Korn 쉘에서는 이것이 불가능합니까? !
답변1
기본적으로 방금 설정한 경우 PS1="...."
설정 시 따옴표 안의 내용이 평가됩니다.
그러나 안에 포함시키면 '
표시될 때 평가됩니다. 그리고 그것은 $(jobs)
.
예를 들어
$ PS1='
> $(jobs)
> $ '
$ sleep 1000 &
[1] 7541
[1] + Running sleep 1000 &
$ sleep 1000 &
[2] 7543
[2] + Running sleep 1000 &
[1] - Running sleep 1000 &
$ kill %1
[1] - Terminated sleep 1000 &
[2] + Running sleep 1000 &
$ kill %2
[2] + Terminated sleep 1000 &
$
(이 테스트는 ksh93을 사용하여 Debian Jessie에서 수행되었지만 모든 ksh93 변형에서 작동해야 합니다. 테스트할 ksh88이 없습니다.)
답변2
내 실제 문제는 (내 질문의 단순화된 예와는 달리) 실제로 jobs
함수의 출력을 조정하여 실행 중인 작업과 중지된 작업을 구분한다는 것입니다.
이것은 내 Bash 코드입니다.
typeset runningJobs=$(jobs -r | wc -l)
typeset stoppedJobs=$(jobs -s | wc -l)
다음과 같이 Korn 쉘로 포팅했습니다.
typeset runningJobs=$(jobs | grep -c ' Running ')
typeset stoppedJobs=$(jobs | grep -c ' Stopped ')
이것관로내부적으로 명령 대체는 $(...)
실제로 jobs
서브쉘에서 실행을 유발합니다(따라서 항상 출력이 생성되지 않습니다). 이는 변수에서 출력을 캡처하여 방지할 수 있습니다. 다음 재작성은 예상대로 작동합니다.
typeset jobOutput=$(jobs)
typeset runningJobs=$(printf '%s\n' "$jobOutput" | grep -c ' Running ')
typeset stoppedJobs=$(printf '%s\n' "$jobOutput" | grep -c ' Stopped ')
실제 문제를 이해하는 데 도움이 된 @StephenHarris의 답변에 감사드립니다!