¿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?

Respuestas:



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.


¿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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.