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:
- 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. - 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:
- Por que meu script de shell se sufoca em espaços em branco ou outros caracteres especiais?
- Quando é necessário fazer uma cotação dupla?
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.