$ PS3が空になっていても$ PS3の内容が表示されるのはなぜですか?

$ PS3が空になっていても$ PS3の内容が表示されるのはなぜですか?
$ 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

ご覧のとおり、、、$PS1$PS2$PS4を持ち、期待どおりに機能します。$PS3空ですが(またはスペース、タブなどが含まれています) for をselect使用しますが、変数が設定されている場合は正しく機能します。#?$PS3

なぜこのように動作し、なぜこのように設計されたのですか?

答え1

なぜなら医師がこう言ったからです。

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

PS3

この変数の値は、コマンドを選択するためのプロンプトとして使用されます。この変数が設定されていない場合、select コマンドは「#?」というメッセージを表示します。

答え2

Bashにハードコードされているようです。execute_cmd.cfunction にはexecute_select_command()次のものがあります。

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

これはPS3設定されていない場合にのみ発生します。空の文字列に設定すると、メッセージはselect表示されません。

答え3

存在するbashPS3"#? "未設定の場合に設定、デフォルトです。

また、POSIXがselect定義されていないPS3ため、動作が異なる場合があります。

  • kshmkshおよびschilyがデフォルトyashに設定されています。zshsh"#? "
  • dash、家宝sh、ビジボックスshが設定されていません。PS3

答え4

他の人がすでにその理由に答えていますが、方法は次のとおりです。 PS3を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

関連情報