Warum wird etwas für $ PS3 angezeigt, auch wenn $ PS3 leer ist?

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

Wie Sie sehen können $PS1, $PS2und $PS4einen Wert haben und wie beabsichtigt arbeiten. $PS3leer ist (oder eine Leerstelle enthält, Tab, etc.), aber selectunter Verwendung von #?für $PS3, aber wenn die Variable gesetzt ist, arbeitet es in der Regel.

Warum verhält sich das so und warum wurde es so entworfen?

Motte001
quelle

Antworten:

15

Weil der Arzt das sagt:

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

PS3

Der Wert dieser Variablen wird als Eingabeaufforderung für den Befehl select verwendet. Wenn diese Variable nicht festgelegt ist, fordert der Befehl select mit '#? '

Jeff Schaller
quelle
2
Der Schlüssel hier ist If this variable is not setTeil. Benutzer kann versuchen, es auf leeres Zeichen oder Leerzeichen oder vielleicht sogar null zu setzen
Sergiy Kolodyazhnyy
11

Es scheint in Bash fest codiert zu sein. In der execute_cmd.cFunktion execute_select_command()gibt es Folgendes:

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

Beachten Sie, dass dies nur passiert, wenn PS3es nicht festgelegt ist. Wenn Sie eine leere Zeichenfolge festlegen, selectwerden Sie gerne mit nichts aufgefordert.

ilkkachu
quelle
Können Sie uns mitteilen, warum dies so gestaltet ist?
Motte001
Ich kann nur vermuten, dass es so ist, dass eine leere Eingabeaufforderung nicht zufällig passiert (da dies verwirrend sein könnte). Aber ich kann es nicht genau wissen, und diese Annahme sagt nichts darüber aus, warum bash dies tut, indem der nicht gesetzte Wert zu einem Sonderfall gemacht wird, anstatt nur die Variable standardmäßig festzulegen.
Ilkkachu
4

In bash, PS3wurde auf , "#? "wenn nicht gesetzt , was Standard ist.

Außerdem ist weder POSIX selectnoch PS3POSIX definiert, sodass das Verhalten variiert werden kann:

  • ksh, mksh, yash, zshUnd schily shgesetzt standardmäßig "#? ".
  • dash, Erbstück sh, Busybox shnicht eingestelltPS3
cuonglm
quelle
Yash 2.39 hat keine PS3 eingestellt
Motte001
@ Motte001 Es tut mit meinem 2.9
cuonglm
Ich habe es auf Ubuntu 16.04
Motte001
1

Andere haben geantwortet, warum, aber hier ist wie - setze deine PS3 auf null:

$ 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
quelle
1
PS3=erreicht das gleiche
chepner
@chepner Warum erreicht es so etwas? Es setzt es nicht auf "\0", es setzt es auf "".
EKons
Da bash in C geschrieben ist und intern jede Zeichenfolge in C mit dem Endzeichen NULL gespeichert wird. Es gibt eine Frage zu U & L irgendwo mit Antwort von Gilles
Sergiy Kolodyazhnyy