![$PS3가 비어 있는데도 $PS3의 내용이 표시되는 이유는 무엇입니까?](https://linux55.com/image/92170/%24PS3%EA%B0%80%20%EB%B9%84%EC%96%B4%20%EC%9E%88%EB%8A%94%EB%8D%B0%EB%8F%84%20%24PS3%EC%9D%98%20%EB%82%B4%EC%9A%A9%EC%9D%B4%20%ED%91%9C%EC%8B%9C%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
$ 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.c
function 에는 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
기본적 으로 설정됩니다 .zsh
sh
"#? "
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