bash: 프롬프트가 평가될 때 상태를 저장하는 방법 [중복]

bash: 프롬프트가 평가될 때 상태를 저장하는 방법 [중복]

명령 프롬프트 f.ex에서 마지막 명령 실행 기간을 입력하고 싶습니다.

user@host$ sleep 360
6m user@host$ 

또한 최소 임계값(예: 30초)보다 작은 경우 지속 시간이 표시되지 않도록 하고 싶습니다.

이를 달성하기 위해 PS1에 함수 호출을 넣을 수 있습니다.

print_duration()
{
    ... calculation and formatting code ...
    echo -n $command_duration
}

PS1='$(print_duration)\u@\h:\W\$ '

문제는 print_duration()이 하위 프로세스 내에서 평가되어 기본 대화형 bash의 환경 변수가 변경되는 것을 방지한다는 것입니다.

위의 코드에 대해 잘 모르지만 해당 코드를 잘라내어 명령 프롬프트에 붙여넣는 간단한 예를 들어 보겠습니다.

prompt_var=0

test_prompt()
{
    (( prompt_var++ ))
    echo -n "I was evaluated at $(date) and look at this: ${prompt_var} "
}

PS1='$(test_prompt)\$ '

결과는 다음과 같습니다.

I was evaluated at Fri, Mar 27, 2015 16:27:48 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:52 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:53 and look at this: 1 $

test_prompt()는 실제로 처음으로 기본 프로세스 컨텍스트에서 평가된다는 점에 유의하세요(함수의 유효성을 확인하고 싶습니다). 그러나 실제 프롬프트 표시의 경우 하위 프로세스에서 이 작업을 수행합니다(아주 깔끔하지는 않습니다).

그러나 주석에서 제안한 대로 PROMPT_COMMAND를 설정하면 다음과 같습니다.

I was evaluated at Fri, Mar 27, 2015 16:38:02 and look at this: 1 $ PROMPT_COMMAND='(( prompt_var++ ))'
I was evaluated at Fri, Mar 27, 2015 16:38:09 and look at this: 2 $
I was evaluated at Fri, Mar 27, 2015 16:38:11 and look at this: 3 $
I was evaluated at Fri, Mar 27, 2015 16:38:12 and look at this: 4 $

이는 PROMPT_COMMAND가 기본 프로세스에서 평가됨을 의미합니다. 하지만 다른 용도로 자주 사용하고, 연결도 불편하고 잊어버릴 수도 있기 때문에 사용하는 것은 바람직하지 않습니다.

답변1

사용PROMPT_COMMAND. 당신이 하고 싶은 일은 바로 그 일을 위한 것입니다. 프롬프트가 평가되기 전에 확장됩니다. 이 코드에서 일부 프롬프트 콘텐츠를 파생하려면 에서 변수를 설정 PROMPT_COMMAND하고promptvars바꾸다, 다음 변수를 에 포함시킵니다 PS1.상태 저장 bash 기능그리고PS1에서 0이 아닌 반환 상태 표시특히모든 명령에 대해 별칭을 강제로 "추가"합니다.몇 가지 예를 들어보세요.

산술 확장을 통해 프롬프트에서 쉘 상태를 변경할 수 있지만 이 방법으로는 정수 변수만 변경할 수 있습니다. 확장된 결과는 프롬프트에 표시되지만 이를 숨기도록 설정할 수 있습니다.

shopt -s promptvars
PS1='${nonexistent_array[$((counter+=$(calculate_increment)))]}…'

링크는 PROMPT_COMMAND매우 간단합니다. 내용을 추가하려면 개행 문자를 추가한 다음 실행하려는 명령을 추가하세요.

관련 정보