각 프롬프트 전에 현재 셸에서 명령을 실행합니다.

각 프롬프트 전에 현재 셸에서 명령을 실행합니다.

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의 답변에 감사드립니다!

관련 정보