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

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

  • Как удалить элемент из списка?
  • Выполнить скрипт оболочки из php, как пользователь root?
  • Переменная IFS игнорируется в системе ()
  • История wiki FreeBSD для sh shell
  • Выполнить файл в своем родном каталоге с помощью сценария оболочки
  • Зарезервированные символы в именах файлов
  • Почему mail-utils / cron отправляет так много писем?
  • Фоновая и передняя задача и выполнение задач параллельно
  • 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 ). Обратитесь к документации команды, чтобы узнать, как справиться с файловыми именами, содержащими двоеточия.

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

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