¿Por qué se muestra algo para $ PS3, incluso cuando $ PS3 está vacío?

9
$ 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, $PS2y $PS4tienen un valor y el trabajo como se pretende. $PS3está vacío (o contiene un espacio, tabulación, etc.), pero selectestá 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?

Motte001
fuente

Respuestas:

15

Porque el doctor lo dice:

https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables

PS3

El valor de esta variable se utiliza como solicitud para el comando de selección. Si no se establece esta variable, el comando de selección solicita '#? '

Jeff Schaller
fuente
2
La clave aquí es If this variable is not setparte. El usuario puede intentar establecerlo en un carácter o espacio en blanco, o tal vez incluso nulo
Sergiy Kolodyazhnyy
11

Parece estar codificado en Bash. En execute_cmd.cfunción execute_select_command(), hay esto:

ps3_prompt = get_string_value ("PS3");
if (ps3_prompt == 0)
    ps3_prompt = "#? ";

Tenga en cuenta que solo sucede si no PS3está configurado. Si lo configura en una cadena vacía, selectfelizmente le indicará, bueno, nada.

ilkkachu
fuente
¿Puede proporcionar información, por qué esto está diseñado de esta manera?
Motte001
Solo puedo adivinar que es para que no aparezca un mensaje vacío por accidente (ya que eso puede ser confuso). Pero no puedo estar seguro, y esa suposición no dice por qué bash lo hace al hacer que el valor no establecido sea un caso especial, en lugar de simplemente establecer la variable por defecto.
ilkkachu
4

En bash, PS3se estableció en "#? "cuando no se estableció , que es el valor predeterminado.

Además, selectni PS3POSIX está definido, por lo que el comportamiento puede variar:

  • ksh, mksh, yash, zshY schily shestablecido por defecto a "#? ".
  • dash, reliquia sh, busybox shno establecePS3
Cuonglm
fuente
Yash 2.39 no tiene un juego de PS3
Motte001
@ Motte001 Lo hace con mi 2.9
cuonglm
Lo probé en Ubuntu 16.04
Motte001
1

Otros han respondido por qué, pero así es cómo: configure su PS3 en nulo:

$ PS3=$'\0'
$ 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
Sergiy Kolodyazhnyy
fuente
1
PS3=logra lo mismo
chepner
@chepner ¿Por qué logra tal cosa? No lo establece en "\0", lo establece en "".
EKons
Porque bash está escrito en C e internamente cada cadena en C se almacena con el carácter NULL final. Hay una pregunta sobre U&L en alguna parte con la respuesta de Gilles
Sergiy Kolodyazhnyy