$ 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 pretendido. $PS3
está vazio (ou contém um espaço, tabulação etc.), mas select
está sendo usado #?
para $PS3
, mas quando a variável é definida, ela funciona normalmente.
Por que isso se comporta dessa maneira e por que foi projetado dessa maneira?
If this variable is not set
parte. O usuário pode tentar defini-lo como personagem em branco ou espaço, ou talvez até mesmo nulaParece estar codificado no Bash. Em
execute_cmd.c
, funçãoexecute_select_command()
, existe o seguinte:Observe que isso só acontece se
PS3
não estiver definido. Se você configurá-lo como uma string vazia,select
será um prazer solicitar com você, bem, nada.fonte
Em
bash
,PS3
foi definido como"#? "
quando não definido , o que é o padrão.Além disso,
select
nemPS3
POSIX é definido, portanto, o comportamento pode ser variado:ksh
,mksh
,yash
,zsh
E Schilysh
definir padrão para"#? "
.dash
, herançash
, busyboxsh
não definePS3
fonte
Outros responderam o porquê, mas aqui está como - defina seu PS3 como nulo:
fonte
PS3=
realiza a mesma coisa"\0"
define, define""
.