Mengapa sesuatu untuk $ PS3 ditampilkan, bahkan ketika $ PS3 kosong?

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

Seperti yang Anda lihat, $PS1, $PS2dan $PS4memiliki nilai dan bekerja seperti yang dimaksudkan. $PS3kosong (atau berisi spasi, tab, dll.), tetapi selectsedang digunakan #?untuk $PS3, tetapi ketika variabel diatur, ia bekerja secara normal.

Mengapa ini berperilaku seperti ini dan mengapa itu dirancang seperti ini?

Motte001
sumber

Jawaban:

15

Karena dokter mengatakan demikian:

https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables

PS3

Nilai variabel ini digunakan sebagai prompt untuk perintah pilih. Jika variabel ini tidak disetel, perintah pilih meminta dengan '#? '

Jeff Schaller
sumber
2
Kuncinya di sini adalah If this variable is not setbagian. Pengguna dapat mencoba mengaturnya ke karakter atau spasi kosong, atau bahkan mungkin nol
Sergiy Kolodyazhnyy
11

Tampaknya hard-coded di Bash. Dalam execute_cmd.c, fungsi execute_select_command(), ini dia:

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

Perhatikan bahwa itu hanya terjadi jika PS3tidak disetel. Jika Anda mengaturnya ke string kosong, selectdengan senang hati akan meminta Anda, ya, tidak ada.

ilkkachu
sumber
Bisakah Anda memberikan informasi, mengapa ini dirancang seperti ini?
Motte001
Saya hanya bisa menebak bahwa agar prompt kosong tidak terjadi secara kebetulan (karena itu mungkin membingungkan). Tapi saya tidak bisa tahu pasti, dan asumsi itu tidak memberi tahu mengapa bash melakukannya dengan membuat nilai yang tidak disetel sebagai kasus khusus, alih-alih hanya mengatur variabel secara default.
ilkkachu
4

Di bash, PS3diatur ke "#? "saat tidak diatur , yang merupakan default.

Juga, POSIX juga selecttidak PS3didefinisikan, sehingga perilaku dapat bervariasi:

  • ksh, mksh, yash, zshDan schily shmengatur default "#? ".
  • dash, heirloom sh, busybox shtidak diaturPS3
cuonglm
sumber
Yash 2.39 tidak memiliki set PS3
Motte001
@ Motte001 Tidak masalah dengan 2.9
cuonglm
Saya mengujinya di Ubuntu 16.04
Motte001
1

Orang lain telah menjawab mengapa, tapi begini caranya - atur PS3 Anda ke nol:

$ 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
Sergiy Kolodyazhnyy
sumber
1
PS3=mencapai hal yang sama
chepner
@ chepner Mengapa ini bisa mencapai hal seperti itu? Itu tidak mengaturnya "\0", mengaturnya "".
EKons
Karena bash ditulis dalam C dan secara internal setiap string dalam C disimpan dengan mengakhiri karakter NULL. Ada pertanyaan tentang U&L di suatu tempat dengan jawaban oleh Gilles
Sergiy Kolodyazhnyy