Pourquoi quelque chose pour $ PS3 est-il affiché, même lorsque $ PS3 est vide?


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

Comme vous pouvez le voir, $PS1, $PS2et $PS4ont une valeur et le travail comme prévu. $PS3est vide (ou contient un espace, une tabulation, etc.), mais selectutilise #?for $PS3, mais lorsque la variable est définie, cela fonctionne normalement.

Pourquoi cela se comporte-t-il ainsi et pourquoi a-t-il été conçu de cette façon?

Réponses:



11

Il semble être codé en dur dans Bash. Dans execute_cmd.c, fonction execute_select_command(), il y a ceci:

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

Notez que cela ne se produit que s'il PS3n'est pas défini. Si vous le définissez sur une chaîne vide, vous selectserez volontiers invité avec, eh bien, rien.


Pouvez-vous fournir des informations, pourquoi cela est conçu de cette façon?
Motte001

Je peux seulement deviner que c'est pour qu'une invite vide ne se produise pas par accident (car cela pourrait être déroutant). Mais je ne peux pas être sûr, et cette hypothèse ne dit pas pourquoi bash le fait en faisant de la valeur unset un cas spécial, au lieu de simplement définir la variable par défaut.
ilkkachu


1

D'autres ont répondu pourquoi, mais voici comment - régler votre PS3 sur 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=accomplit la même chose
chepner

@chepner Pourquoi accomplit-il une telle chose? Il ne le définit pas "\0", il le définit "".
EKons

Parce que bash est écrit en C et en interne chaque chaîne en C stockée avec un caractère NULL de fin. Il y a une question sur U&L quelque part avec une réponse de Gilles
Sergiy Kolodyazhnyy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.