$ 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
Wie Sie sehen können $PS1
, $PS2
und $PS4
einen Wert haben und wie beabsichtigt arbeiten. $PS3
leer ist (oder eine Leerstelle enthält, Tab, etc.), aber select
unter Verwendung von #?
für $PS3
, aber wenn die Variable gesetzt ist, arbeitet es in der Regel.
Warum verhält sich das so und warum wurde es so entworfen?
If this variable is not set
Teil. Benutzer kann versuchen, es auf leeres Zeichen oder Leerzeichen oder vielleicht sogar null zu setzenEs scheint in Bash fest codiert zu sein. In der
execute_cmd.c
Funktionexecute_select_command()
gibt es Folgendes:Beachten Sie, dass dies nur passiert, wenn
PS3
es nicht festgelegt ist. Wenn Sie eine leere Zeichenfolge festlegen,select
werden Sie gerne mit nichts aufgefordert.quelle
In
bash
,PS3
wurde auf ,"#? "
wenn nicht gesetzt , was Standard ist.Außerdem ist weder POSIX
select
nochPS3
POSIX definiert, sodass das Verhalten variiert werden kann:ksh
,mksh
,yash
,zsh
Und schilysh
gesetzt standardmäßig"#? "
.dash
, Erbstücksh
, Busyboxsh
nicht eingestelltPS3
quelle
Andere haben geantwortet, warum, aber hier ist wie - setze deine PS3 auf null:
quelle
PS3=
erreicht das gleiche"\0"
, es setzt es auf""
.