Простое решение состоит в том, чтобы поставить одинарную кавычку ('
) в начале и еще одну одинарную кавычку в конце и заменить все '
внутри имени файла последовательностью из 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) вам необходимо заключать в кавычки следующие символы по крайней мере в некоторых случаях.
!
— расширение истории. "
— синтаксис оболочки. #
— начало комментария после пробела; подстановочные знаки zsh. $
— синтаксис оболочки. &
— синтаксис оболочки . '
— синтаксис оболочки. (
— даже в середине слова: расширенные подстановочные знаки ksh (также доступны в bash и zsh); подстановочные знаки zsh. )
(см. (
) *
— подстановочный знак sh. ,
— только внутри фигурной скобки. ;
— оболочка синтаксис. <
— синтаксис оболочки. =
— в zsh, когда стоит в начале имени файла (расширение имени файла с поиском в PATH). >
— оболочка синтаксис. ?
— подстановочный знак sh.[
— подстановочный знак sh. \
— синтаксис оболочки. ]
— вы можете оставить это без кавычек. ^
— расширение истории; подстановочный знак zsh. `
— синтаксис оболочки. {
— раскрытие фигурной скобки. |
— синтаксис оболочки. }
— необходимо экранировать в zsh, другие оболочки более снисходительны, когда нет подходящей открывающей скобки. ~
— расширение домашнего каталога, когда он находится в начале имени файла; подстановочный знак зш; всегда безопасно, когда это последний символ. Еще несколько символов могут иногда требовать специальной обработки:
-
не являются специальными для оболочки, но когда они находятся в начале аргумента команды, они указывают на опцию. Его нельзя защитить кавычками, так как специальная обработка находится в команде, а не в оболочке. Чтобы защитить имя файла, начинающееся с -
, вы можете поставить перед ним ./
— таким образом, это все тот же файл, но аргумент не начинается с -
больше. .
сам по себе не является чем-то особенным, но файлы точек по умолчанию исключены из глобусов *
. :
не является специальным для оболочки, но некоторые команды анализируют его специально, например. для указания удаленного файла (имя хоста:имя файла
). Обратитесь к документации команды, чтобы узнать, как справиться с именами файлов, содержащими двоеточие. ¹ Если пользователь не настроил альтернативные символы расширения истории. Некоторые оболочки это позволяют. Это еще одна причина использовать одинарные кавычки, а не обратную косую черту.
Привет, спасибо, Йохан Майрин, ты был прав, но у меня все еще были проблемы с его работой. Я начал следовать этому руководству https://scottlinux.com/2014/04/28/debian-linux-home-router-with-ipv4-and-ipv6/ , это похоже на меня, но между интерфейсами eth0 и eth1 я подумал, что это может быть и eth0, и wlan0. Сначала я неправильно прочитал руководство и немного перепутал IP-адрес в radvd, но, наконец, дело сделано. В руководстве рекомендуется статический IP-адрес на eth1 или, в моем случае, wlan0 для меня автоматически работал нормально, пока я менял IP-адрес в radvd.
radvd.conf
prefix 2001:470:28:46e::/64
Теперь все в порядке, Йохан, если бы у меня был ваш адрес, я бы отправил вам торт :)