Tente fazer isso:
$ read -r -p 'Please enter a string >>> ' var
$ printf '%q\n' "$var"
\*\*\*\<\>\<\>\<\|\|\&\&\*\&\$PATH
Existe alguma maneira de ler texto bruto de stdin
antes de ser expandido ou antes de o shell fazer alguma coisa? Digamos que eu queira executar um script em que um usuário insere uma string que é impressa, como obtenho o seguinte comportamento:
$ sh test.sh
Please enter a string:
***<><><||&&*&$PATH
You entered:
***<><><||&&*&$PATH
Existe alguma maneira de envolver implicitamente o texto com ''
ou escapar de todos os meta caracteres, mesmo que o usuário não o faça?
A expansão, se houver, está acontecendo quando você imprime, não quando você lê. (como disse Giles, a magia está no% q. Mas mesmo o eco "$ var" não é expandido). Ler obtém todos os caracteres literais na variável, exceto barra invertida. O eco da variável nua é expandido. O eco da variável em uma string "quote" não é expandido:
xxmetac.sh:
#!/bin/bash
read str
echo you entered:
echo $str
echo "$str"
teste:
$ ls
file1 file2 file3
$ xxmetac.sh
*
you entered:
file1 file2 file3
*
Além disso, a maioria dos metacaracteres de shell não são especiais mesmo quando são ecoados. Provavelmente apenas os arquivos de globulação:
*?[-]{,}
Não é especial:
!#@$^%()|<>
$ xxmetac.sh
>
you entered:
>
>
$ xxmetac.sh
|
you entered:
|
|
$ xxmetac.sh
@$^%()|<>
you entered:
@$^%()|<>
@$^%()|<>
Eles são especiais na linha de comando
$ !#@$^%()|<>
@$^%()|<>
bash: syntax error near unexpected token '|'