$PS3가 비어 있는데도 $PS3의 내용이 표시되는 이유는 무엇입니까?

$PS3가 비어 있는데도 $PS3의 내용이 표시되는 이유는 무엇입니까?
$ echo $PS1
$
$ echo $PS2
>
$ echo $PS3

$ echo $PS4
+
$ select i in 1 2 3
> do
> case $i in
> 1)
> echo 1
> ;;
> *)
> ;;
> esac
> done
1) 1
2) 2
3) 3
#? 1
1
$ PS3="##? "
$ select i in 1 2 3; do case $i in 1) echo 1; ;; *) ;; esac; done
1) 1
2) 2
3) 3
##? 1
1

보시다시피 $PS1, , $PS2$PS4값을 가지며 예상대로 작동합니다. $PS3비어 있지만(또는 공백, 탭 등이 포함되어 있음) for 을 select사용 하지만 변수가 설정되면 제대로 작동합니다.#?$PS3

왜 이런 식으로 동작하고 왜 이렇게 설계되었나요?

답변1

왜냐하면 의사가 이렇게 말했기 때문입니다.

https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables

PS3

이 변수의 값은 명령 선택을 위한 프롬프트로 사용됩니다. 이 변수가 설정되지 않은 경우 select 명령은 "#?"라는 메시지를 표시합니다.

답변2

Bash에 하드코딩된 것 같습니다. execute_cmd.cfunction 에는 execute_select_command()다음이 있습니다.

ps3_prompt = get_string_value ("PS3");
if (ps3_prompt == 0)
    ps3_prompt = "#? ";

이는 PS3설정되지 않은 경우에만 발생합니다. 빈 문자열로 설정하면 select아무런 메시지도 표시되지 않습니다.

답변3

존재하다 bash,PS3"#? "설정되지 않은 경우로 설정,기본값입니다.

또한 POSIX가 select정의 되지 않았 PS3으므로 동작이 다를 수 있습니다.

  • ksh, mksh및 schily가 yash기본적 으로 설정됩니다 .zshsh"#? "
  • dash, 가보 sh, 비지박스 sh가 설정되지 않았습니다.PS3

답변4

다른 사람들이 이미 그 이유에 대해 답변했지만, 방법은 다음과 같습니다. PS3를 null로 설정하세요.

$ PS3=$'\0'
$ select i in 1 2 3; do case $i in 1) echo "option #" 1; ;; *) ;; esac; done
1) 1
2) 2
3) 3
1
option # 1

관련 정보