Porque o documento diz:
PS3
The value of this variable is used as the prompt for the select command. If this variable is not set, the select command prompts with ‘#? ’
$ 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
Como você pode ver, $PS1
, $PS2
e $PS4
têm um valor e funcionam como previsto. $PS3
está vazio (ou contém um espaço, tabulação, etc.), mas select
está usando #?
para $PS3
, mas quando a variável está definida, ela funciona normalmente.
Por que isso se comporta dessa maneira e por que foi projetado dessa maneira?
Porque o documento diz:
PS3
The value of this variable is used as the prompt for the select command. If this variable is not set, the select command prompts with ‘#? ’
Parece ser codificado em Bash. Em execute_cmd.c
, função execute_select_command()
, tem isto:
ps3_prompt = get_string_value ("PS3");
if (ps3_prompt == 0)
ps3_prompt = "#? ";
Observe que isso só acontece se PS3
não estiver definido. Se você configurá-lo para uma string vazia, select
terá prazer em perguntar, bem, nada.
Em bash
, PS3
foi definido como "#? "
quando não definido , que é o padrão.
Além disso, nem select
nem PS3
é POSIX definido, portanto, o comportamento pode ser variado:
ksh
, mksh
, yash
, zsh
e schily sh
definiu como padrão "#? "
. dash
, herança sh
, busybox sh
não definiu PS3
Outros responderam porque, mas aqui está como - configure seu PS3 para null:
$ PS3=$'$ PS3=$'%pre%'
$ 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
'
$ 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