Perché viene mostrato qualcosa per $ PS3, anche quando $ PS3 è vuoto?


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

Come si può vedere, $PS1, $PS2e $PS4hanno un valore e il lavoro come previsto. $PS3è vuoto (o contiene uno spazio, una scheda, ecc.), ma selectsta usando #?per $PS3, ma quando la variabile è impostata, funziona normalmente.

Perché questo si comporta in questo modo e perché è stato progettato in questo modo?

Risposte:



11

Sembra essere codificato in Bash. In execute_cmd.c, funzione execute_select_command(), c'è questo:

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

Si noti che succede solo se PS3non è impostato. Se lo imposti su una stringa vuota, selectti verrà felicemente richiesto, beh, niente.


Potete fornire informazioni, perché questo è progettato in questo modo?
Motte001,

Posso solo supporre che sia così che un prompt vuoto non accada per caso (dal momento che potrebbe essere fonte di confusione). Ma non posso saperlo con certezza, e questo presupposto non dice perché bash lo faccia trasformando il valore non impostato in un caso speciale, invece di impostare semplicemente la variabile per impostazione predefinita.
ilkkachu,


1

Altri hanno risposto al perché, ma ecco come - imposta la tua PS3 su 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=compie la stessa cosa
chepner l'

@chepner Perché realizza una cosa del genere? Non lo imposta su "\0", lo imposta su "".
EKons,

Perché bash è scritto in C e internamente ogni stringa in C memorizzata con il carattere NULL finale. C'è una domanda su U&L da qualche parte con la risposta di Gilles
Sergiy Kolodyazhnyy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.