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.