PS3 및 PS4 프롬프트 변수의 이상한 동작

PS3 및 PS4 프롬프트 변수의 이상한 동작

프롬프트를 사용자 정의하는 것이 가능하다는 것을 알고 있습니다(예:6.9 제어 프롬프트섹션), 저는 한동안 이 작업을 해왔지만 최근에 이상한 동작을 발견했습니다.

다음 두 가지 시나리오를 고려해보세요.

이스케이프 시퀀스 없음

PS1='\$ '
PS2='> '
PS3='#? '
PS4='+ '

이스케이프 시퀀스 없음

이스케이프 시퀀스 사용

PS1='\[\e[1;34m\]\$\[\e[0m\] '
PS2='\[\e[1;34m\]>\[\e[0m\] '
PS3='\[\e[1;34m\]#?\[\e[0m\] '
PS4='\[\e[1;34m\]+\[\e[0m\] '

이스케이프 시퀀스 사용

따라서 질문은 다음과 같습니다.

  • PS3인쇄되다있는 그대로, 이스케이프 시퀀스를 해석하지 않고.
  • PS4인쇄도 하지 않습니다.

나는 그들이 이전에 효과가 있었다고 확신하지만 자주 사용하지 않기 때문에 그들이 언제 잘못 행동했는지는 모릅니다.


기술적 세부 사항

  • 운영 체제:우분투 16.04.4
  • 껍데기:Bash 4.3.48(1) - 출시됨
  • 터미널 에뮬레이터:GNOME Terminal 3.18.3 (단, 가상 터미널에서도 발생함)
  • 내가 아는 한, 시스템이 설치된 이후(2017-06-09) Bash 업데이트는 없었습니다.

답변1

에서 man bash:

PS1    The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.  The default value is ``\s-\v\$ ''.
PS2    The value of this parameter is expanded as with PS1 and used as the secondary prompt string.  The default is ``> ''.
PS3    The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4    The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays  during  an  execution  trace.   The

따라서 어떤 이유로든 확장하지 않는 것은 PS3문서화된 동작입니다.

PS4새로운 호출에서 사용할 수 있도록 변수를 내보내야 합니다 bash. 그리고 추적 옵션을 -v활성화하지 않고 명시적으로 설정해야 합니다 .

pse@Mithos:~/.tmp$ export PS4='uuuu: '
pse@Mithos:~/.tmp$ bash -c "set -x; echo foo"
uuuu: echo foo
foo

답변2

bash매뉴얼 에서 :

   PS1    The  value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.  The default
          value is ``\s-\v\$ ''.
   PS2    The value of this parameter is expanded as with PS1 and used as the secondary prompt string.  The default  is  ``>
          ''.
   PS3    The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
   PS4    The  value  of  this  parameter is expanded as with PS1 and the value is printed before each command bash displays
          during an execution trace.  The first character of PS4 is replicated multiple times,  as  necessary,  to  indicate
          multiple levels of indirection.  The default is ``+ ''.

PS3정의아니요다른 프롬프트 문자열과 동일한 방식으로 확장되도록 선언합니다. 표시되는 동작은 설명서와 일치합니다.

관련 정보