Невозможно написать # без комментария

Это сделано для устранения ошибки/неправильного функционирования в оболочках, отличных от zsh,fishи потомки оболочки Форсайта (, включая pdkshи производные ), посредством чего глобусы .*включают .и..(в системах (, к сожалению, ), где readdir()возвращает их)

Этими снарядами,

chmod -R og-rwx.*

например, будет рекурсивно удалять разрешения rwx для текущего и родительского каталога, а не только для скрытых файлов и каталогов в текущем каталоге. Для этого пришлось добавить обходной путь rm, так как слишком много людей споткнулись о rm -rf.*.

Это также (вероятно, чаще )используется для передачи всех файлов (скрытых или нет )в качестве аргументов для команды (cmd.[!.]*..?* *), для которой вы найдете другие обходные пути в зависимости от оболочка .

Это особенно плохо для команд, которые делают что-то рекурсивно или работают с каталогами, такими как ls.*, chown -R.*, find.*, grep -r blah.*, но это все еще раздражает для большинства других команд, и я не могу придумать ни одной команды для которые вы хотели бы, чтобы эти .и ..были включены в список файлов, переданных им.

Глоб .[^.]*(.[!.]*в оболочках Bourne/POSIX )исключает .(, так как он совпадает с именами файлов, содержащими по крайней мере два символа )и ..(, так как второй символ — ., который не не соответствует [^.]), но также исключает такие файлы, как ..foo, для которых вам нужен второй глобус ..?*.

Эти .и ..являются инструментами для обхода каталогов, ошибочно указывать их как обычные файлы. POSIX требует, чтобы они понимались в компонентах пути (, как в open("."), stat("foo/../bar")), но не обязательно реализовывались как элементы каталога и не включались в readdir().

Тем не менее, большинство систем по-прежнему реализуют те, что были в ранних версиях Unices, в виде жестких ссылок, а те, которые этого не делают, по-прежнему будут подделывать записи для них в выводе getdents()/ readdir().

С bash,альтернативой является включение опции dotglobи использование:

chmod -R og-rwx [.]*

(однако имейте в виду, что если нет скрытого файла, отличного от -, он может изменить права доступа к файлу [.]*, если только у вас не была включена опция failglobдля имитации поведения zsh/fish).

Как примечание к истории, имена файлов, начинающиеся с ., являющиеся скрытыми файлами, были рождены из-за ошибки кодирования, когда кто-то пытался пропустить .и ..в первую очередь . По иронии судьбы, пытаясь сделать что-то со скрытыми файлами, мы столкнемся с той же проблемой.

-1
07.09.2019, 00:54
2 ответа

Вы также можете экранировать #обратной косой чертойPASSWORD=xpto\#123

0
28.01.2020, 05:07

Если что

PASSWORD=xpto#123

был кодом в любом Bourne -подобном оболочке (bash, dash, ksh, zsh... ), что #не будет восприниматься как комментарий. В этих оболочках #вводит комментарий только в начале токена оболочки (, поэтому в начале строки или после пробелов или ;, |, &&... ).

Это будет восприниматься как символ комментария в оболочке rcили производных¹ (, которые являются другими оболочками, имеющими назначение в форме var=value), но я сомневаюсь, что вы их используете.

Скорее всего, вы пытаетесь использовать это в каком-то файле конфигурации, где также часто #вводят комментарии.

Не существует настоящего стандарта для конфигурационных файлов, поэтому экранирование этого символа, если он рассматривается как комментарий, зависит от фактического конфигурационного файла.

Лучше всего прочитать руководство для этого файла конфигурации или программного обеспечения, для которого он предназначен.

Распространенными способами экранирования символов являются двойные кавычки ("..."), одинарные кавычки('...')или обратная косая черта перед символом. Также возможно ввести символ, используя восьмеричные последовательности²(\043)или шестнадцатеричные²(\x23)или Unicode (\u0023)...Также могут быть некоторые различия в том, как обрабатываются кавычки (независимо от того, является ли обратная косая черта или другие символы специальными в кавычках... ).


¹ В оболочке rcединственным оператором кавычек является '...'(, а сама одинарная кавычка представлена ​​''внутри этих одинарных кавычек ). В оболочке es(, полученной из клона Байрона Ракитциса rcдля Unix ), вы также можете использовать \#, \043или \x23.

² Обратите внимание, что они представляют значение байта , поэтому \x43будет кодировать только #в наборе символов ASCII или совместимом, что должно быть подавляющим большинством кодировок, используемых в настоящее время, единственными исключениями будут некоторые редкие системы IBM, которые все еще используют EBCDIC. Но об этом следует помнить при использовании символов, отличных от -ASCII. \u0023, с другой стороны, гарантирует, что (Unicode )будет символом #.

4
28.01.2020, 05:07

Теги

Похожие вопросы