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

7
$ 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 , $PS2 e $PS4 têm um valor e funcionam como previsto. $PS3 está vazio (ou contém um espaço, tabulação, etc.), mas select está usando #? para $PS3 , mas quando a variável está definida, ela funciona normalmente.

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

    
por Motte001 10.08.2016 / 17:38

4 respostas

14

Porque o documento diz:

link

PS3

The value of this variable is used as the prompt for the select command. If this variable is not set, the select command prompts with ‘#? ’

    
por 10.08.2016 / 17:55
11

Parece ser codificado em Bash. Em execute_cmd.c , função execute_select_command() , tem isto:

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

Observe que isso só acontece se PS3 não estiver definido. Se você configurá-lo para uma string vazia, select terá prazer em perguntar, bem, nada.

    
por 10.08.2016 / 17:55
4

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

Além disso, nem select nem PS3 é POSIX definido, portanto, o comportamento pode ser variado:

  • ksh , mksh , yash , zsh e schily sh definiu como padrão "#? " .
  • dash , herança sh , busybox sh não definiu PS3
por 10.08.2016 / 18:04
1

Outros responderam porque, mas aqui está como - configure seu PS3 para null:

$ PS3=$'
$ PS3=$'%pre%'
$ 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
' $ 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
    
por 10.08.2016 / 23:03

Tags