最新のためのPOSIX仕様のバージョン(2017年現在)rm
ユーティリティがあり、ここで(と前のそこ)との削除を禁止.
して..
。
ファイルのドットまたはドットドットのいずれかがオペランドのベース名部分(つまり、最終パス名コンポーネント)として指定されている場合、またはオペランドがルートディレクトリに解決される場合、rmは診断メッセージを標準エラーに書き込み、何もしません。そのようなオペランドの場合はもっと。
@jlliagreが述べたように、約の部分/
はSUSv4の追加です。
GNU fileutilsのchangelogのコメントは古いPOSIX仕様のケースに既にあることを示唆しているが、私が見つけることができる最も古い公に利用可能なUnix仕様(XPF4 CAE rev2(1994))は既にそれを指定し.
、..
削除できない。
それが適用されることに注意dir/..
して../
も、しかし(Solarisの11とMacOSのようなUNIX認定のものを含む)いくつかの実装はまだに対する保護をしませんrm -rf ../
かrm -rf .*/
)。
歴史
初期の大学
の-r
オプションrm
はUnix V3(1973)で追加されましたが、ディレクトリのコンテンツを削除するだけでしたが、ディレクトリを削除するにはまだ使用rmdir
する必要があります。
Unix V7(1979年、Bourneシェルも導入し、ほとんどのUnicesが派生したリリース)で変更されました。rm -r
ディレクトリも削除され、..
ディレクトリツリーが削除されなくなりました。manページの状態:
ファイルを削除することは..
単にのようなことを不注意に行うことの反社会的結果を避けるために禁止されていますrm -r .*
。
(1は、それが主張するかもしれませんがrm -r .*
、まだある反社会的ので、それがすべてを削除として.
含まれています)。
それはまだ取り除くために受け入れなかった.
、それは解除しませんけれども.
か..
のエントリを。したがってrm -r .
、現在のディレクトリを空にする効果的な方法でした。
また、セーフガードはリテラル..
引数のみであり、dir/..
またはではないことに注意してください./..
。したがって、rm -rf ./.*
親ディレクトリのすべてを再帰的に削除します。
それはそれはグロブを含めることができたことにより、バグ/設計ミス回避するためにすでにあったと見るのは興味深いです.
し、..
その展開では。フォーサイスシェル80年代後半で(元のMinixシェルとpdkshのための基礎)、中に固定されたことzsh
(1990)とfish
(2005)ではなく、他のシェルを、特にPOSIXのではないsh
の拡充が必要で言語が.*
含まれるように.
して..
いる場合によって返されますreaddir()
(グロブ(1つを除く)がorを含まないbash
部分でのみ問題に対処し、で、を実行することで修正できます)。shopt -s dotglob
.xxx
.
..
ksh
FIGNORE='@(.|..)'
正確に禁止すること.
もいつ追加されたかは必ずしも明確ではなく、各Unixによって異なります。以下のいくつかの発見。
BSD
.
2.9BSD(1983)から2.10BSD(1987)の間、および4.2BSD(1983)から4.3BSD(1986)の間に禁止が追加されました(unix-history-repoで1985年のタイムスタンプが付けられたこの変更を参照)。
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");
以下のためにdir/.
とdir/..
、参照1988年にこの変更(BSD 4.3ネット/ 1)。
これまでのところ、rm
FreeBSD(およびmacOSのような派生物)は、現在または親ディレクトリを空にします(rm -rf ./
またはrm -rf ../
重要ですrm -rf .*/
)。
システムV
V7以降のAT&T Unix派生物については、ソースもバイナリも公開されていないため、あまり情報がありません。同社のオンラインマニュアルでは、(システムIIIに基づく)、HP-UXはまだそれだけ禁止であると述べて..
効果的にそれはおそらく、少なくともSysIIIがの削除禁止していないことを示していた両方禁止しながら.
(編集今見て:SysIII rm
ソースコードは、それはですUnix V7以降実質的に変更されていません)。
私がチェックした他のすべてのオンラインマニュアルでは、POSIX準拠であると思われる削除.
または..
禁止が言及されています。
Solarisのはrm
まだ時に電流または親ディレクトリを空にしrm -rf ./
たりrm -rf ../
。
GNU
GNU fileutilsの初期の変更ログには、すべての履歴情報が含まれています。
もともとはどちらも削除しないものの.
、または..
禁止された、..
最初にして、両方(を含む禁止されたdir/.
すべての1990年と1991年の間、)。
その他
で見たように、zsh
での拡張.*
(または任意のグロブ)には、.
または..
(sh
エミュレーションモードでも)含まれることはありません。したがって、rm
ビルトイン(を使用した場合に取得されますzmodload zsh/files
)は.
、..
特別な扱いをしません。だから、それをzsh
組み込み、あなたができるrm -rf .
か、rm -rf ..
空にする.
か..
が、rm -rf .*
削除されません.
か..
。
busyboxの内rm
の削除の禁止.
及び..
0.52(2001)に添加しました
rm
にあることを知っていますが、一致するときchmod
にchown
、などで予期しない結果が生じる可能性があることに言及する価値があると思いました.*
。