Простое решение состоит в том, чтобы поместить одну кавычку ( ') в начале и другую одинарную кавычку в конце и заменить каждый 'символ в имени файла последовательностью из 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). Обратитесь к документации команды, чтобы узнать, как справиться с именами файлов, содержащими двоеточия.
¹ Если пользователь не настроил альтернативные символы расширения истории. Некоторые оболочки позволяют это. Это еще одна причина использовать одинарные кавычки, а не обратную косую черту.