$ 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