$ 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
, $PS2
et $PS4
ont une valeur et le travail comme prévu. $PS3
est vide (ou contient un espace, une tabulation, etc.), mais select
utilise #?
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?
If this variable is not set
partie. L'utilisateur peut essayer de le définir sur un caractère ou un espace vide, ou peut-être même nulIl semble être codé en dur dans Bash. Dans
execute_cmd.c
, fonctionexecute_select_command()
, il y a ceci:Notez que cela ne se produit que s'il
PS3
n'est pas défini. Si vous le définissez sur une chaîne vide, vousselect
serez volontiers invité avec, eh bien, rien.la source
Dans
bash
, aPS3
été défini sur"#? "
lorsqu'il n'est pas défini , ce qui est par défaut.De plus, ni n'est défini Posix, de sorte que le comportement peut varier:
select
PS3
ksh
,mksh
,yash
,zsh
Et schilysh
paramètre par défaut défini à"#? "
.dash
, héritagesh
, busyboxsh
ne définissent pasPS3
la source
D'autres ont répondu pourquoi, mais voici comment - régler votre PS3 sur null:
la source
PS3=
accomplit la même chose"\0"
, il le définit""
.