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?

Jawaban:



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.


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.