Получите необработанный ввод из командной строки (игнорируйте метасимволы оболочки)

Есть ли способ прочитать исходный текст из stdin перед его расширением или до того, как оболочка что-нибудь сделает с ним? Скажем, я хотел запустить скрипт, где пользователь вводит строку, которая затем распечатана, как я могу получить следующее поведение:

 $ sh test.sh Please enter a string: ***<><><||&&*&$PATH You entered: ***<><><||&&*&$PATH 

Есть ли какой-либо способ неявно окружать текст '' или '' или избежать всех метасимволов, даже если пользователь этого не делает?

Попробуйте сделать это:

 $ read -r -p 'Please enter a string >>> ' var $ printf '%q\n' "$var" \*\*\*\<\>\<\>\<\|\|\&\&\*\&\$PATH 

Расширение, если оно есть, происходит при печати, а не при чтении. (как сказал Джайлс, магия находится в% q. Но даже эхо «$ var» не расширяется). Чтение получает все литералы в переменную, кроме обратной косой черты. Эхо голой переменной расширяется. Эхо переменной в строке «quote» не расширяется:

xxmetac.sh:

 #!/bin/bash read str echo you entered: echo $str echo "$str" 

контрольная работа:

 $ ls file1 file2 file3 $ xxmetac.sh * you entered: file1 file2 file3 * 

Кроме того, большинство метасимволов оболочки не являются особенными даже при эхом. Вероятно, только файлообменные:

 *?[-]{,} 

Не специально:

 !#@$^%()|<> $ xxmetac.sh > you entered: > > $ xxmetac.sh | you entered: | | $ xxmetac.sh @$^%()|<> you entered: @$^%()|<> @$^%()|<> 

Они специальные в командной строке

 $ !#@$^%()|<> @$^%()|<> bash: syntax error near unexpected token `|'