Obtém entrada bruta da linha de comando (ignore os meta-caracteres do shell)

6

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?

    
por gambol 25.02.2013 / 03:07

2 respostas

6

Tente fazer isso:

$ read -r -p 'Please enter a string >>> ' var
$ printf '%q\n' "$var"
\*\*\*\<\>\<\>\<\|\|\&\&\*\&\$PATH
    
por 25.02.2013 / 03:11
0

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 '|'
    
por 18.09.2017 / 22:16

Tags