У меня есть основанная на браузере оболочка / терминал, которая выполняет команды bash, и я экранирую пробелы, но оказывается, что скобки также должны быть экранированы. Какие еще символы необходимо экранировать для имен файлов, которые не в кавычках?
12
mv filename filename-foo
в bash, какие символы мне нужно экранировать, кроме пробелов и скобок?mv "$filename" "$newname"
.Ответы:
Простое решение состоит в том, чтобы поместить одну кавычку (
'
) в начале и другую одинарную кавычку в конце и заменить каждый'
символ в имени файла последовательностью из 4 символов'\''
. Все символы теряют свое специальное значение внутри строки в одинарных кавычках, кроме'
самого себя, который отмечает конец строки. Последовательность'\''
заканчивается литералом в одинарных кавычках, сразу же следует одинарная кавычка и открывает новый литерал в одинарных кавычках. Таким образом, имя файламожно процитировать следующим образом:
Двойные кавычки имеют более сложные правила экранирования и не позволяют вам включать восклицательный знак,
!
если подстановка истории активирована, поэтому я не буду их рассматривать дальше.Альтернативный подход заключается в защите символов с помощью обратной косой черты. Это работает для каждого персонажа, кроме перевода строки; для новой строки единственное решение - поместить его в одинарные кавычки (или двойные кавычки). Если вы хотите минимизировать количество обратных слешей, чтобы представить имя в кавычках пользователю, вы можете ограничить его местами, где необходим обратный слеш; однако чем больше обратной косой черты вы пропускаете, тем больше рискуете забыть ту, которая нужна. Буквы, цифры и не-ASCII символы всегда в порядке. Цитируйте пробел и пунктуацию всякий раз, когда вы не уверены.
В обычной оболочке (ksh, bash или zsh) вам необходимо заключать в кавычки следующие символы, по крайней мере, при некоторых обстоятельствах.
!
- расширение истории."
Синтаксис оболочки.#
- комментарий начинается, когда ему предшествует пробел; зш подстановочные знаки.$
Синтаксис оболочки.&
Синтаксис оболочки.'
Синтаксис оболочки.(
- даже в середине слова: расширенные глобусы ksh (также доступны в bash и zsh); зш подстановочные знаки.)
(см.(
)*
- подстановочный знак.,
- только внутри расширения скобки.;
Синтаксис оболочки.<
Синтаксис оболочки.=
- в zsh, когда оно находится в начале имени файла (расширение файла с поиском PATH).>
Синтаксис оболочки.?
- подстановочный знак.[
- подстановочный знак.\
Синтаксис оболочки.]
- вы можете оставить это без кавычек.^
- расширение истории; зш подстановочный знак.`
Синтаксис оболочки.{
Расширение скобки.|
Синтаксис оболочки.}
- необходимо экранировать в zsh, другие оболочки более мягкие, когда нет соответствующей открывающей скобки.~
- расширение домашнего каталога, когда оно находится в начале имени файла; zsh подстановочный знак; всегда безопасно, когда это последний символ.Еще несколько символов могут требовать специальной обработки иногда:
-
не является особенным для оболочки, но когда он находится в начале аргумента команды, он указывает опцию. Он не может быть защищен кавычками, поскольку специальная обработка находится в команде, а не в оболочке. Чтобы защитить имя файла, которое начинается с-
, вы можете поставить./
перед ним - таким образом, это все тот же файл, но аргумент больше не начинается с-
..
сам по себе не является особенным, но файлы*
точек по умолчанию исключаются из глобусов.:
не является особенным для оболочки, но некоторые команды анализируют его специально, например, для указания удаленного файла (hostname:filename
). Обратитесь к документации команды, чтобы узнать, как справиться с именами файлов, содержащими двоеточия.¹ Если пользователь не настроил альтернативные символы расширения истории. Некоторые оболочки позволяют это. Это еще одна причина использовать одинарные кавычки, а не обратную косую черту.
источник
LF
только, могут быть заключены с обратной косой чертой в некоторых оболочках.