为什么会显示 $PS3 的内容,即使 $PS3 是空的?

Mot*_*001 9 bash prompt

$ 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,$PS1,$PS2和$PS4有一个值和工作像预期。$PS3为空(或包含空格、制表符等),但select正在使用#?for $PS3,但设置变量后,它可以正常工作。

为什么会这样,为什么会这样设计?

Jef*_*ler 15

因为医生是这么说的:

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

PS3

此变量的值用作选择命令的提示。如果未设置此变量,则选择命令会提示“#? '

  • 这里的关键是“如果未设置此变量”部分。用户可以尝试将其设置为空白字符或空格,甚至可能为空 (2认同)

ilk*_*chu 11

它似乎是在 Bash 中硬编码的。在execute_cmd.c, function 中execute_select_command(),有这个:

ps3_prompt = get_string_value ("PS3");
if (ps3_prompt == 0)
    ps3_prompt = "#? ";
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在PS3未设置时发生。如果你将它设置为一个空字符串,它select会很高兴地提示你,好吧,什么都没有。