$ PS3が空の場合でも、$ PS3の何かが表示されるのはなぜですか?


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

あなたは、見ることができるように$PS1$PS2そして$PS4意図のような値と仕事を持っています。$PS3空です(またはスペース、タブなどが含まれます)がfor selectを使用#?$PS3ていますが、変数が設定されている場合は正常に動作します。

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

回答:


15

ドキュメントがそう言うので:

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

PS3

この変数の値は、selectコマンドのプロンプトとして使用されます。この変数が設定されていない場合、selectコマンドは '#?」


2
ここでの鍵はIf this variable is not set一部です。ユーザーはそれを空白文字またはスペース、あるいはnullに設定してみることができます
Sergiy Kolodyazhnyy

11

Bashでハードコーディングされているようです。ではexecute_cmd.c、機能execute_select_command()、これがあります:

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

PS3が設定されていない場合にのみ発生することに注意してください。空の文字列に設定するselectと、何も表示されずに喜んでプロンプトが表示されます。


情報を提供できますか、なぜこれがこのように設計されているのですか?
Motte001 2016

空のプロンプトが誤って発生しないようにするためです(混乱を招く可能性があるため)。しかし、私は確実に知ることはできません。その仮定は、デフォルトで変数を設定するだけでなく、未設定の値を特別なケースにすることによってbashがそれを行う理由を教えてくれません。
ilkkachu

4

bashPS3が設定されて"#? "いないときに設定されまし。これがデフォルトです。

また、POSIXも定義されていselectないPS3ため、動作を変えることができます。

  • kshmkshyashzshおよびシリーshにデフォルトを設定"#? "
  • dash、家宝sh、busybox shは設定しませんPS3

Yash 2.39にはPS3が設定されていません
Motte001

@ Motte001それは私の2.9で行われます
cuonglm

私はUbuntu 16.04でテストしました
Motte001

1

他の人が理由を答えましたが、こちらがその方法です-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

1
PS3=同じことを達成する
chepner

@chepnerなぜそれがそのようなことを達成するのですか?に設定するのではなく"\0"、に設定し""ます。
EKons

bashはCで記述されており、内部ではCの各文字列がNULL文字で終了して格納されているためです。U&Lに関する質問がGillesの回答とともにどこかにあります
Sergiy Kolodyazhnyy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.