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


9
$ 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使用#?$PS3,但是当变量被设置,它工作正常。

为什么这样做如此,为什么要这样设计?

Answers:



11

它似乎在Bash中进行了硬编码。在中execute_cmd.c,功能为execute_select_command()

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

请注意,只有在PS3未设置时,它才会发生。如果将其设置为空字符串,select将很高兴地提示您什么都没有。


您能提供信息吗,为什么要这样设计?
Motte001 '16

我只能猜到是这样,这样就不会偶然出现空提示(因为这可能会造成混淆)。但是我不确定,这种假设并不能说明为什么bash通过将unset值设置为特殊情况而不是默认设置变量来实现它。
ilkkachu


1

其他人已经回答了为什么,但是这是方法-将您的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

1
PS3=完成相同的事情
chepner

@chepner为什么要完成这样的事情?它没有将其设置为"\0",而是将其设置为""
EKons,2016年

因为bash是用C编写的,所以内部的C中的每个字符串都以结尾NULL字符存储。关于U&L的一个问题,吉尔斯(Gilles)回答
Sergiy Kolodyazhnyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.