프롬프트를 사용자 정의하는 것이 가능하다는 것을 알고 있습니다(예: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
정의아니요다른 프롬프트 문자열과 동일한 방식으로 확장되도록 선언합니다. 표시되는 동작은 설명서와 일치합니다.