Простое решение состоит в том, чтобы поместить одну кавычку ( '
) в начале и другую одинарную кавычку в конце и заменить каждый '
символ в имени файла последовательностью из 4 символов '\''
. Все символы теряют свое специальное значение внутри строки в одинарных кавычках, кроме '
самого себя, который отмечает конец строки. Последовательность '\''
заканчивается литералом в одинарных кавычках, сразу же следует одинарная кавычка и открывает новый литерал в одинарных кавычках. Таким образом, имя файла
This file's name has some weird characters!
Will you manage to escape them?
можно процитировать следующим образом:
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
Двойные кавычки имеют более сложные правила экранирования и не позволяют вам включать восклицательный знак, !
если подстановка истории активирована, поэтому я не буду их рассматривать дальше.
Альтернативный подход заключается в защите символов с помощью обратной косой черты. Это работает для каждого персонажа, кроме перевода строки; для новой строки единственное решение - поместить его в одинарные кавычки (или двойные кавычки). Если вы хотите минимизировать количество обратных слешей, чтобы представить имя в кавычках пользователю, вы можете ограничить его местами, где необходим обратный слеш; однако чем больше обратной косой черты вы пропускаете, тем больше рискуете забыть ту, которая нужна. Буквы, цифры и не-ASCII символы всегда в порядке. Цитируйте пробел и пунктуацию всякий раз, когда вы не уверены.
В обычной оболочке (ksh, bash или zsh) вам необходимо заключать в кавычки следующие символы, по крайней мере, при некоторых обстоятельствах.
- Пробелы (пробел, табуляция, новая строка - запоминание того, что новые строки нельзя заключать в кавычки).
!
- расширение истории.
"
Синтаксис оболочки.
#
- комментарий начинается, когда ему предшествует пробел; зш подстановочные знаки.
$
Синтаксис оболочки.
&
Синтаксис оболочки.
'
Синтаксис оболочки.
(
- даже в середине слова: расширенные глобусы ksh (также доступны в bash и zsh); зш подстановочные знаки.
)
(см. (
)
*
- подстановочный знак.
,
- только внутри расширения скобки.
;
Синтаксис оболочки.
<
Синтаксис оболочки.
=
- в zsh, когда оно находится в начале имени файла (расширение файла с поиском PATH).
>
Синтаксис оболочки.
?
- подстановочный знак.
[
- подстановочный знак.
\
Синтаксис оболочки.
]
- вы можете оставить это без кавычек.
^
- расширение истории; зш подстановочный знак.
`
Синтаксис оболочки.
{
Расширение скобки.
|
Синтаксис оболочки.
}
- необходимо экранировать в zsh, другие оболочки более мягкие, когда нет соответствующей открывающей скобки.
~
- расширение домашнего каталога, когда оно находится в начале имени файла; zsh подстановочный знак; всегда безопасно, когда это последний символ.
Еще несколько символов могут требовать специальной обработки иногда:
-
не является особенным для оболочки, но когда он находится в начале аргумента команды, он указывает опцию. Он не может быть защищен кавычками, поскольку специальная обработка находится в команде, а не в оболочке. Чтобы защитить имя файла, которое начинается с -
, вы можете поставить ./
перед ним - таким образом, это все тот же файл, но аргумент больше не начинается с -
.
.
сам по себе не является особенным, но файлы *
точек по умолчанию исключаются из глобусов.
:
не является особенным для оболочки, но некоторые команды анализируют его специально, например, для указания удаленного файла ( hostname:filename
). Обратитесь к документации команды, чтобы узнать, как справиться с именами файлов, содержащими двоеточия.
¹ Если пользователь не настроил альтернативные символы расширения истории. Некоторые оболочки позволяют это. Это еще одна причина использовать одинарные кавычки, а не обратную косую черту.