Здравствуйте, Pzz, Вы писали:
Pzz>mkdir "*" Pzz>mkdir ".xxx" V>Задачка такая, создать папку с символами `*` и `.`
Pzz>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя.
Уверен? Я вот после этого финта от линукса — не уверен.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
Pzz>>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя. V>Уверен? Я вот после этого финта от линукса — не уверен.
Здравствуйте, Pzz, Вы писали:
Pzz>>>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя. V>>Уверен? Я вот после этого финта от линукса — не уверен. Pzz>Уверен
Откуда, если оно позволяет создать такие папки с запрещёнными символами?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
Pzz>>>>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя. V>>>Уверен? Я вот после этого финта от линукса — не уверен. Pzz>>Уверен V>Откуда, если оно позволяет создать такие папки с запрещёнными символами?
В линуксе для имен файлов вроде ничего не запрещено от слова совсем. Там и перевод строки в имени файла может быть. Просто некоторые символы shell интерпретирует, а ядру пофик.
В Винде по-другому — некоторые символы явно запрещены к использованию в файловой системе. Не уверен, правда, от ядра или от ФС это зависит
Здравствуйте, Vain, Вы писали:
V>если оно позволяет создать такие папки с запрещёнными символами?
Почему ты решил, что это запрещённые символы?
В *nix только два символа запрещены к использованию в файловых именах: / и \0 (символ с кодом 0). На остальные нет явных ограничений у ОС: хоть звёздочки используй, хоть весь остальный юникод.
(Тут только файловая система что-то может запретить создавать, если, например, она старая и поддерживает только ASCII-кодировку, а не тот же произвольный юникод).
Pzz>>>>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя. V>>>Уверен? Я вот после этого финта от линукса — не уверен. Pzz>>Уверен V>Откуда?
А они уже и так созданы в каждом каталоге :) Вполне себе причина почему их нельзя создать второй раз.
Здравствуйте, Marty, Вы писали:
M>В Винде по-другому — некоторые символы явно запрещены к использованию в файловой системе. Не уверен, правда, от ядра или от ФС это зависит
Так они и в винде создаются. Через cygwin.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
M>>В Винде по-другому — некоторые символы явно запрещены к использованию в файловой системе. Не уверен, правда, от ядра или от ФС это зависит V>Так они и в винде создаются. Через cygwin.
Здравствуйте, Marty, Вы писали:
M>>>В Винде по-другому — некоторые символы явно запрещены к использованию в файловой системе. Не уверен, правда, от ядра или от ФС это зависит V>>Так они и в винде создаются. Через cygwin. M>'*', '?', '/' и '\'?
* и ? создаются
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
M>>>>В Винде по-другому — некоторые символы явно запрещены к использованию в файловой системе. Не уверен, правда, от ядра или от ФС это зависит V>>>Так они и в винде создаются. Через cygwin. M>>'*', '?', '/' и '\'? V>* и ? создаются
Возможно, что '*' и '?' обрабатывает подсистема Win32, а ntkernel их не обрабатывает, чем цигвин и пользуется
Здравствуйте, Vain, Вы писали:
Pzz>>Уверен V>Откуда, если оно позволяет создать такие папки с запрещёнными символами?
В юниксе нет запрещенных символов. Есть ровно два символа, которые имеют специальное значение: "/" — разделитель пути, и символ с кодом 0 — завершает строку.
"." — это имя текущей директории, ".." — имя ее "родителя", они уже присутствуют в каждой директории, и именно поэтому их нельзя создать. В венде, кстати, тоже.
Здравствуйте, Marty, Вы писали:
M>В линуксе для имен файлов вроде ничего не запрещено от слова совсем. Там и перевод строки в имени файла может быть. Просто некоторые символы shell интерпретирует, а ядру пофик.
В юниксе можно создать имя файла, содержащее такую ESC-последовательность, что если на это имя посмотреть через ls, то терминал в ответ скажет "rm -rf /", или любую другую команду, благо что почти все терминалы — в той или иной степени клоны VT109.
Здравствуйте, Pzz, Вы писали:
M>>В линуксе для имен файлов вроде ничего не запрещено от слова совсем. Там и перевод строки в имени файла может быть. Просто некоторые символы shell интерпретирует, а ядру пофик.
Pzz>В юниксе можно создать имя файла, содержащее такую ESC-последовательность, что если на это имя посмотреть через ls, то терминал в ответ скажет "rm -rf /", или любую другую команду, благо что почти все терминалы — в той или иной степени клоны VT109.
Здравствуйте, Marty, Вы писали:
Pzz>>В юниксе можно создать имя файла, содержащее такую ESC-последовательность, что если на это имя посмотреть через ls, то терминал в ответ скажет "rm -rf /", или любую другую команду, благо что почти все терминалы — в той или иной степени клоны VT109.
M>"Это не баг, это — фича" (c) утерян
"Это не правда, что UNIX — не дружественная к пользователю операционная система. Просто UNIX очень тщательно отбирает себе друзей" (ц)
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Marty, Вы писали:
M>>В линуксе для имен файлов вроде ничего не запрещено от слова совсем. Там и перевод строки в имени файла может быть. Просто некоторые символы shell интерпретирует, а ядру пофик.
Pzz>В юниксе можно создать имя файла, содержащее такую ESC-последовательность, что если на это имя посмотреть через ls, то терминал в ответ скажет "rm -rf /", или любую другую команду, благо что почти все терминалы — в той или иной степени клоны VT109.
Не получится. Обычный ls от такого защищается (при выводе на терминал). Ubuntu, FreeBSD — одинаково:
$ cd /tmp
$ mkdir a
$ cd a
$ touch $'\x1baa'
$ ls
?aa
$ ls -b
\033aa
VT109 среди DECʼовских терминалов не встречается. Имелся в виду VT100?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Pzz, Вы писали:
Pzz>>>>Папку (и файл), имя которой состоит из одной или двух точек, создать нельзя. V>>>Уверен? Я вот после этого финта от линукса — не уверен. Pzz>>Уверен V>Откуда, если оно позволяет создать такие папки с запрещёнными символами?
Смешиваете три существенно разные вещи:
1. Запрещённые символы в пути — их ровно два: '\0' и '/'.
2. Зарезервированные служебные имена — их тоже два: "." и "..", несмотря на то, что просто точка не является запрещённым символом, и имён, в которые входит точка, в любой реальной системе более 100500.
Но: этот резерв — дело конкретных FS, а не файловой подсистемы в целом. Теоретически возможна FS, где их нет (хотя реально ни один безумец такого не сделает).
3. Метасимволы шелла, в которые входит '*' (см. старт треда), но не точка и не косая черта. Они должны экранироваться для указания в именах, есть несколько разных методов экранирования. Их состав слегка разный для разных шеллов: например, bash и zsh дают специальную роль для ':', но не простой sh (включая bash в режиме совместимости с POSIX sh).
NB особый случай к (2), не меняющий общую картину: удалённый каталог. Делаем следующий эксперимент:
$ cd /tmp
$ mkdir b; cd b
$ ls -la
total 24
drwxr-xr-x 2 netch netch 4096 кві 1 14:28 .
drwxrwxrwt 33 root root 20480 кві 1 14:28 ..
$ rmdir /tmp/b
$ ls -la
total 0
$ touch 111
touch: cannot touch '111': No such file or directory
Каталог ещё существует как текущий для данного процесса, но содержимого у него нет и ничего в нём сделать уже нельзя — это просто фантом бывшей vnode. То же, если он был открыт отдельно и использовался для openat() или аналога.