Por que algo para o $ PS3 é mostrado, mesmo quando o $ PS3 está vazio?

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

Como você pode ver, $PS1, $PS2e $PS4têm um valor e funcionam como pretendido. $PS3está vazio (ou contém um espaço, tabulação etc.), mas selectestá sendo usado #?para $PS3, mas quando a variável é definida, ela funciona normalmente.

Por que isso se comporta dessa maneira e por que foi projetado dessa maneira?

Motte001
fonte

Respostas:

15

Porque o documento diz o seguinte:

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

PS3

O valor dessa variável é usado como prompt para o comando select. Se essa variável não estiver definida, o comando select solicitará com '#? "

Jeff Schaller
fonte
2
A chave aqui é If this variable is not setparte. O usuário pode tentar defini-lo como personagem em branco ou espaço, ou talvez até mesmo nula
Sergiy Kolodyazhnyy
11

Parece estar codificado no Bash. Em execute_cmd.c, função execute_select_command(), existe o seguinte:

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

Observe que isso só acontece se PS3não estiver definido. Se você configurá-lo como uma string vazia, selectserá um prazer solicitar com você, bem, nada.

ilkkachu
fonte
Você pode fornecer informações, por que isso foi projetado dessa maneira?
precisa saber é o seguinte
Só posso supor que é para que um prompt vazio não aconteça por acidente (pois isso pode ser confuso). Mas não tenho certeza, e essa suposição não diz por que o bash faz isso, tornando o valor não definido em um caso especial, em vez de apenas definir a variável por padrão.
ilkkachu
4

Em bash, PS3foi definido como "#? "quando não definido , o que é o padrão.

Além disso, selectnem PS3POSIX é definido, portanto, o comportamento pode ser variado:

  • ksh, mksh, yash, zshE Schily shdefinir padrão para "#? ".
  • dash, herança sh, busybox shnão definePS3
cuonglm
fonte
Não Yash 2,39 não tem PS3 set
Motte001
@ Motte001 Ele faz com a minha 2,9
cuonglm
Eu testei no Ubuntu 16.04
Motte001 11/11
1

Outros responderam o porquê, mas aqui está como - defina seu PS3 como nulo:

$ 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
fonte
1
PS3=realiza a mesma coisa
chepner
@chepner Por que isso acontece? Não "\0"define, define "".
EKons
Como o bash é escrito em C e internamente cada string em C é armazenada com o caractere NULL final. Existe uma pergunta sobre U&L em algum lugar com resposta por Gilles
Sergiy Kolodyazhnyy