Короткая
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
Выдержки из "man bash":
Цитирование
Цитирование используется для удаления особого значения определенных символов или слов в оболочке. Кавычки могут использоваться для отключения специальной обработки для специальных символов, для предотвращения распознавания зарезервированных слов как таковых и для предотвращения расширения параметров.
РАСШИРЕНИЕ
Расширение выполняется в командной строке после того, как оно было разбито на слова. Есть семь видов
выполненного расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, команда
подстановка, арифметическое расширение, разбиение слов и расширение пути.
Только расширение фигурных скобок, разбиение слов и расширение пути могут изменить количество слов в
расширение; другие расширения расширяют одно слово в одно слово. Единственными исключениями к этому являются
расширения "$@"
и "${name[@]}"
, как описано выше (см. ПАРАМЕТРЫ).
Разделение слов
Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметического раскрытия
это не произошло в двойных кавычках для разделения слов.
Цитата Удаление
После предыдущих расширений, все без кавычек вхождения символов \
, '
и "
, которые не
результат от одного из вышеперечисленных расширений удаляется.