为什么即使 $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为空(或包含空格、制表符等),但select使用的是#?for $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

bashPS3"#? "未设置时设置为,这是默认值。

此外,POSIX 也没有select定义PS3,因此行为可以变化:

  • kshmkshyashzshschilysh将默认设置为"#? "
  • dash, 传家宝sh, busyboxsh不设置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

相关内容