Какие символы нужно избегать в файлах без кавычек?

У меня есть браузер / оболочка / терминал, который выполняет команды bash, и я избегаю пробелов, но оказывается, что скобки также должны быть экранированы. Какие еще символы должны быть экранированы для имен файлов, которые не указаны в кавычках?

One Solution collect form web for “Какие символы нужно избегать в файлах без кавычек?”

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

С типичной оболочкой (ksh, bash или zsh) вам нужно указать следующие символы, по крайней мере, в некоторых случаях.

  • Пробелы (пробел, вкладка, новая строка – запоминание того, что символы новой строки не могут быть процитированы с обратной косой чертой).
  • ! – расширение истории.
  • " – синтаксис оболочки.
  • # – запуск комментария, когда ему предшествуют пробелы; zsh подстановочные знаки.
  • Синтаксис $ – оболочки.
  • & – синтаксис оболочки.
  • ' – синтаксис оболочки.
  • ( – даже в середине слова: расширенные шары ksh (также доступны в bash и zsh), zsh -символы.
  • ) (см. ( )
  • * – sh wildcard.
  • , – только внутри расширения скобы.
  • ; – синтаксис оболочки.
  • < – синтаксис оболочки.
  • = – в zsh, когда он находится в начале имени файла (расширение имени файла с помощью поиска PATH).
  • > – синтаксис оболочки.
  • ? – Шрифт.
  • [ – sh wildcard.
  • \ – синтаксис оболочки.
  • ] – вы можете уйти, оставив его без кавычек.
  • ^ – расширение истории; zsh.
  • ` – синтаксис оболочки.
  • { – расширение брекета.
  • | – синтаксис оболочки.
  • } – требуется экранирование в zsh, другие оболочки более снисходительны, если нет подходящей открытой скобки.
  • ~ – расширение домашней директории, когда оно находится в начале имени файла; zsh wildcard; всегда безопасно, когда это последний символ.

Иногда нескольким персонажам может потребоваться специальная обработка:

  • - не является специальным для оболочки, но когда он находится в начале аргумента команды, он указывает параметр. Он не может быть защищен кавычками, поскольку специальная обработка находится в команде, а не в оболочке. Чтобы защитить имя файла, которое начинается с - , вы можете поставить ./ перед ним – таким образом, это все тот же файл, но аргумент не начинается с - больше.
  • . не является самоцелью, но точечные файлы по умолчанию исключаются из * globs.
  • : не является специальным для оболочки, но некоторые команды анализируют его специально, например, для указания удаленного файла ( hostname:filename ). Обратитесь к документации команды, чтобы узнать, как справиться с файловыми именами, содержащими двоеточия.

¹ Если пользователь не настроил альтернативные символы расширения истории. Некоторые оболочки позволяют это. Это еще одна причина использовать одинарные кавычки, а не обратную косую черту.

  • Как получить IP-адрес с помощью сценария оболочки?
  • как это сделать: dd if = coolstuff.iso of = (ssh kev @ mypi)
  • Напишите в FIFO только в том случае, если он существует
  • Как я могу перечислить каждый порт, обслуживающий веб-страницу
  • Есть ли отладчик GUI для сценариев оболочки
  • Bash: Почему считывается, возвращая ненулевой статус выхода во время чтения моего файла?
  • путают с переменными awk и shell
  • Способ записи нового имени файла на подстановочный знак?
  • / dev / sda2 отправлено 49710 дней без проверки, проверьте принудительный
  • Каковы существенные различия между различными раковинами?
  • Получить последнюю минуту из строк из списка
  • grep. * возвращает результаты из .bash_history и жалуется на
  • Interesting Posts

    Пересылка электронной почты по входящему адресу

    Как средняя длина очереди ожидания равна 1, а средняя нагрузка почти равна нулю

    Сервер вышел в режим «только для чтения», у него возникла проблема с FSCK

    Анализировать системные журналы с помощью logwatch -range, кроме как только «вчера»,

    dd для клонирования с меньшим sdcard

    Получить apache для обслуживания Markdown как HTML

    Установить переменную среды для диспетчера файлов Ranger

    Как распечатать следующие задачи crontab для выполнения?

    Чистая установка Debian jessie 8

    Почему эта переменная не имеет значения, даже если она установлена ​​в .bashrc?

    Lintian сообщает не-dev-pkg-with-shlib-symlink, тогда как dh_auto_install делает эту ссылку

    Что такое время компиляции, время загрузки и время выполнения?

    Как суммировать числа, имеющие соответствующие строки

    Где находятся дисплеи, отличные от «: 0»?

    Как получить последнюю папку (отсортированную по алфавиту в порядке убывания и сопоставление шаблона) с помощью ls / find / etc?

    Linux и Unix - лучшая ОС в мире.