Короткая
Bash уже имеет дело с этим. Достаточно процитировать.
ls "$INPUT"
Долго
Примерное руководство по тому, как оболочка анализирует эту строку:
"ls \"$INPUT\"" # Raw command line.
["ls", "\"$INPUT\""] # Break into words.
["ls", "\"filename; rm -rf /\""] # Perform variable expansion.
["ls", "\"filename; rm -rf /\""] # Perform word splitting (no change).
["ls", "filename; rm -rf /"] # Remove quotes.
Из-за кавычек переменная $INPUT
не подвергается разбиению на слова. ls
будет искать файл с именем filename; rm -rf /
.
Если бы вы не указали его, расширение происходило бы по-другому:
"ls $INPUT" # Raw command line.
["ls", "$INPUT"] # Break into words.
["ls", "filename; rm -rf /"] # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"] # Perform word splitting.
По крайней мере, вы можете утешаться тем, что на самом деле это не приведет к выполнению rm -rf /
. Вместо этого он передаст каждую из этих строк как имя файла в ls
. Вы ls
удалите некоторые файлы, которые не планировали, но, по крайней мере, это не вызовет случайного выполнения нежелательных команд.
jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory
Выдержки из "человека баш":
ЦИТАТА
Цитирование используется для удаления специального значения определенных символов или слов из оболочки. Кавычки можно использовать для отключения специальной обработки специальных символов, предотвращения распознавания зарезервированных слов как таковых и предотвращения расширения параметров.
РАСШИРЕНИЕ
Расширение выполняется в командной строке после ее разделения на слова. Выполняется семь видов расширения: раскрытие фигурных скобок, расширение с помощью тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разбиение на слова и расширение пути.
Только раскрытие фигурных скобок, разбиение на слова и расширение имени пути могут изменить количество слов расширения; другие расширения расширяют одно слово до одного слова. Единственным исключением являются расширения "$@"
и "${name[@]}"
, как описано выше (см. ПАРАМЕТРЫ).
Разделение слов
Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметического расширения, которые не происходили в двойных кавычках, для разделения слов.
Удаление цитаты
После предыдущих расширений все вхождения символов \
, '
и "
без кавычек, которые не являются результатом одного из приведенных выше расширений, удаляются.
person
John Kugelman
schedule
25.11.2010