$ 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
, но когда переменная установлена, она работает нормально.
Почему это ведет себя так и почему это было разработано таким образом?
If this variable is not set
частью. Пользователь может попытаться установить его в качестве пустого символа или пробела, или, может быть, даже нулевогоПохоже, это жестко закодировано в Bash. В
execute_cmd.c
функцииexecute_select_command()
есть вот что:Обратите внимание, что это происходит только если
PS3
не установлено. Если вы установите пустую строку,select
вам с радостью предложат, ну, ничего.источник
In
bash
,PS3
было установлено,"#? "
когда не установлено , что по умолчанию.Кроме того, ни POSIX , ни его
select
неPS3
определены, поэтому поведение может быть различным:ksh
,mksh
,yash
,zsh
И Шилиsh
устанавливается по умолчанию в"#? "
.dash
,sh
семейная реликвия , busyboxsh
не установленPS3
источник
Другие ответили почему, но вот как - установите PS3 на ноль:
источник
PS3=
выполняет то же самое"\0"
, это устанавливает это""
.