ler o comando com ??? entrada

1

Por que, ao ler a entrada com read , e a entrada é ??? , o resultado é bin src ?

$ read
???
$ echo $REPLY
bin src

Executando bash no macOS.

    
por YardenST 22.11.2018 / 19:30

1 resposta

3

Os dados mantidos na variável REPLY ainda são ??? , mas o resultado de usar a variável não citada com echo , como você está fazendo, é o mesmo que fazer

echo ???

Você precisa duplicar todas as expansões de variáveis.

Quando você deixa uma expansão variável sem aspas, duas coisas acontecem:

  1. O valor da variável é divisão em várias palavras. A divisão acontece sempre que um caractere é igual a um dos caracteres em $IFS (um espaço, tabulação e uma nova linha por padrão). No seu caso, o resultado da divisão é o mesmo de antes da divisão (a única palavra ??? ) se o valor de $IFS não for modificado.
  2. Cada palavra gerada sofre geração de nome de arquivo , ou "globbing de nome de arquivo". Isso significa que, se uma palavra for um padrão globbing, que ??? é, qualquer nome de arquivo correspondente a esse padrão substituirá o padrão. O padrão ??? corresponde a qualquer nome de arquivo com três caracteres e obviamente você tem dois deles em seu diretório de trabalho atual.

Nenhuma dessas coisas acontece se a expansão da variável for citada duas vezes.

Exemplo, recriando seu problema e resolvendo-o:

$ ls
X11R6   games   lib     libexec mdec    ports   share   xobj
bin     include libdata local   obj     sbin    src
$ read
???
$ echo $REPLY
bin lib obj src
$ echo ???
bin lib obj src
$ echo "$REPLY"
???

Outro exemplo no mesmo diretório acima, mostrando que a string que eu insiro é dividida em duas palavras ( ??? e s* ) e que elas são usadas como padrões de globalização de nomes de arquivo:

$ read
??? s*
$ echo $REPLY
bin lib obj src sbin share src
$ echo "$REPLY"
??? s*

Observe que src é enviado duas vezes, pois corresponde a ambos os ??? e s* .

Relacionados:

Breve resumo das perguntas e respostas acima: Sempre aspas duplas todas , a menos que você saiba exatamente quais não precisam ou se você realmente deseja invocar divisão e globbing.

    
por 22.11.2018 / 19:38

Tags