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?

Antworten:



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.


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.