$ 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 se puede ver, $PS1
, $PS2
y $PS4
tienen un valor y el trabajo como se pretende. $PS3
está vacío (o contiene un espacio, tabulación, etc.), pero select
está utilizando #?
for $PS3
, pero cuando se establece la variable, funciona normalmente.
¿Por qué esto se comporta de esta manera y por qué fue diseñado de esta manera?
If this variable is not set
parte. El usuario puede intentar establecerlo en un carácter o espacio en blanco, o tal vez incluso nuloParece estar codificado en Bash. En
execute_cmd.c
funciónexecute_select_command()
, hay esto:Tenga en cuenta que solo sucede si no
PS3
está configurado. Si lo configura en una cadena vacía,select
felizmente le indicará, bueno, nada.fuente
En
bash
,PS3
se estableció en"#? "
cuando no se estableció , que es el valor predeterminado.Además,
select
niPS3
POSIX está definido, por lo que el comportamiento puede variar:ksh
,mksh
,yash
,zsh
Y schilysh
establecido por defecto a"#? "
.dash
, reliquiash
, busyboxsh
no establecePS3
fuente
Otros han respondido por qué, pero así es cómo: configure su PS3 en nulo:
fuente
PS3=
logra lo mismo"\0"
, lo establece en""
.