Выражение .*
расширяется с помощью bash для включения текущего и родительского каталогов:
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
Если я запускаю rm -rf .*
на своем Debian с помощью GNU bash version 4.2.36(1)-release
и rm
из rm (GNU coreutils) 8.13
, я получаю это сообщение:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Это вещь GNU или это POSIX? Существуют ли системы * nix, где приведенная выше команда будет молча удалять .
и ..
?
Кроме того, это функция безопасности оболочки или самой rm
команды?
rm
, но я подумал , что это стоит отметить , что вы можете иметь неожиданные результаты сchmod
,chown
и т.д. при совмещении.*
.Ответы:
Версия последней (по состоянию на 2017 г.) в спецификации POSIX для
rm
утилиты здесь (и предыдущий там ) и запрещает удаление.
и..
.Как отмечает @jlliagre, часть о
/
дополнении в SUSv4.Самая старая общедоступная спецификация Unix, которую я смог найти ( XPF4 CAE rev2 (1994)), уже указала это
.
и..
не может быть удалена, хотя комментарии в журнале изменений GNU fileutils предполагают, что это уже имело место в более старых спецификациях POSIX.Обратите внимание, что это относится и к,
dir/..
и../
к тому же, но некоторые реализации (включая UNIX-сертифицированные, такие как Solaris 11 и macOS) все еще не защищают отrm -rf ../
илиrm -rf .*/
).история
Ранние объединения
-r
Опцияrm
была добавлена в Unix V3 (1973) , хотя это было только удаление содержимого каталогов, вам все равно нужно использоватьrmdir
для удаления каталогов.Это изменилось в Unix V7 (1979, выпуск, который также представил оболочку Bourne и из которой происходит большинство Unices).
rm -r
теперь также удаляются каталоги и не будут удалять..
дерево каталогов. На странице руководства государства:(хотя можно утверждать, что
rm -r .*
это антисоциально, поскольку удаляет все, потому что.
включено).Он все же согласился удалить,
.
хотя он не отменял связь.
ни с..
записями, ни с. Итак,rm -r .
был эффективный способ очистить текущий каталог.Также обратите внимание, что гарантия была только для буквального
..
аргумента, а не дляdir/..
или./..
. Таким образом,rm -rf ./.*
все равно все рекурсивно удаляется из родительского каталога.Интересно видеть, что это было уже для обхода ошибки / ошибочной характеристики, которую глобусы могли включать
.
и..
в их расширение. Это было исправлено в оболочке Forsyth (основа для оригинальной оболочки Minix и pdksh) в конце 80-хzsh
(1990) иfish
(2005), но не в других оболочках и, в частности, не вsh
языке POSIX, который требует расширения.*
для включения.
и,..
если они возвращаютсяreaddir()
(bash
решает проблему частично только вshopt -s dotglob
тех случаях, когда глобусы (кроме.xxx
тех) не включают.
или..
, и, с помощьюksh
, вы можете исправить это, выполнивFIGNORE='@(.|..)'
).Когда
.
было добавлено точное запрещение, это не всегда понятно и зависит от каждого Unix. Несколько выводов ниже.BSDs
Запрещая из
.
добавляли то между 2.9BSD (1983) и 2.10BSD (1987) , а также между 4.2BSD (1983) и 4.3BSD (1986) (см это изменение датируемые 1985 в unix-истории-репо ).Для
dir/.
иdir/..
см это изменение в 1988 году (BSD 4.3 Net / 1).На данный момент
rm
FreeBSD (и его производные, такие как macOS) по-прежнему очищают текущий или родительский каталогrm -rf ./
илиrm -rf ../
хотя бы (имеет значение дляrm -rf .*/
).Система V
У меня не так много информации, так как ни исходный, ни двоичный файлы не доступны для производных AT & T Unix после V7. В своем электронном руководстве, HPUX ( на основе System III) до сих пор упоминает , что он только запрещает ,
..
а эффективно это запрещает и что является свидетельством того, что , вероятно , по крайней мере , SysIII не запрещает удаление.
( редактирование : Теперь , глядя на в SysIIIrm
исходном коде , это практически не изменился со времен Unix V7).Все другие онлайн-руководства, которые я проверил, упоминают об удалении
.
или..
запрещении, которое, как ожидается, должно соответствовать POSIX.Solaris по-
rm
прежнему очищает текущий или родительский каталог послеrm -rf ./
илиrm -rf ../
.GNU
Рано изменений для FileUtils GNU имеет всю историческую информацию.
Хотя первоначально ни удаление,
.
ни..
были запрещены,..
сначала было запрещено, а затем оба (включаяdir/.
), все в период с 1990 по 1991 год.Другие
Как мы видели
zsh
, расширение.*
(или любой глобус) никогда не включает.
или..
(даже вsh
режиме эмуляции). Поэтомуrm
встроенный (который вы получаете, если выzmodload zsh/files
) не относится.
или..
специально. Таким образом, с этимzsh
встроенным, вы можетеrm -rf .
илиrm -rf ..
очистить.
или..
, ноrm -rf .*
не удалит.
или..
.В busybox
rm
запрет на удаление.
и..
был добавлен в 0.52 (2001)источник
rm -rf . /
(обратите внимание на пробел) следует вывести два предупреждения (для.
и/
) и завершиться, но у нас, похоже, возникает вопрос, как восстанавливаться после этого каждые пару месяцев.