この式は.*
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 .*
GNU bashを使用してDebianで実行し、version 4.2.36(1)-release
fromrm
で実行すると、rm (GNU coreutils) 8.13
次のメッセージが表示されます。
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
これはGNUかPOSIXですか?上記のコマンドが自動的に削除さ.
れる* nixシステムはありますか..
?
また、これはrm
シェルのセキュリティ機能ですか、それともコマンド自体ですか?
答え1
このユーティリティのPOSIX仕様の最新バージョン(2017年基準)は次のとおりrm
です。ここ(前の記事もそうです。そこ)およびおよび削除を禁止.
します..
。
ファイルポイントまたはドットポイント(dot-dot)がオペランドのデフォルト名部分(つまり、最終パス名部分)として指定されている場合、またはオペランドがルートディレクトリとして解決される場合、rmは標準エラーに診断メッセージを書き、何もしないでください。 。
@jlliagreが指摘したように、関連部分は/
SUSv4の新機能です。
私が見つけることができる最も古い公開Unix仕様(XPF4 CAEリビジョン2(1994))、これは指定され、.
削除..
できません.ただし、GNU fileutils 変更ログのコメントには、これが以前の POSIX 仕様にすでに存在していることを示します。
dir/..
でも動作しますが、一部の実装(Solaris 11やmacOSなどのUNIX認証実装を含む)はまだ../
保護されていません。rm -rf ../
rm -rf .*/
歴史
初期ユニス
-r
このオプションはUnix V3(1973)に追加されており、rm
ディレクトリの内容のみを削除しますが、rmdir
ディレクトリを削除するにはまだこのオプションを使用する必要があります。
このような状況はUnix V7(1979、Bourneシェルを導入し、ほとんどのUnicesが派生)で変更されました。rm -r
これでディレクトリも削除され、..
ディレクトリツリーは削除されません。これマニュアルページ状態:
..
誤って同様のことを行うことで、反社会的な結果を避ける目的でのみファイルを削除することは禁止されていますrm -r .*
。
rm -r .*
(誰かはこれがまだだと言うかもしれませんが、社会に反する含まれているすべてを削除するためです.
。
それでも削除はできますが、リンクを解除したりエントリを入力したりすることはありませ.
ん。その後、現在のディレクトリを消去するのが効果的な方法です。.
..
rm -r .
また、保護はリテラル..
引数にのみ適用dir/..
されます./..
。したがって、rm -rf ./.*
親ディレクトリのすべてのエントリは依然として再帰的に削除されます。
興味深いことに、これは.
globが拡張できるバグ/バギー機能をすでに解決しています。この問題は、1980年代後半(1990)と(2005)のForsythシェル(元のMinixシェルとpdkshのベース)で修正されましたが、..
他のシェル、特に拡張機能を含める必要があるPOSIX言語では修正されていません。 (グロップを除く)globにorが含まれていない問題の一部のみを解決し、を使用すると、次の手順を実行して問題を解決できます。zsh
fish
sh
.*
.
..
readdir()
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派生製品のソースコードやバイナリが公開されていないため、情報はあまりありません。オンラインマニュアルでは、HPUX(System IIIベース)はまだアンインストールのみを無効にしていると述べています..
が、実際には両方を無効にします。これは、少なくともSysIIIが除去を無効にしない可能性があることを意味します.
(編集する:見ているSysIIIrm
ソースコード、Unix V7以降ほとんど変更されていません)。
私が確認した他のすべてのオンラインマニュアルには、POSIXと互換性がなければならない削除または.
抑制に関する言及があります。..
Solarisはまだrm
現在のディレクトリまたは親ディレクトリを空にします。rm -rf ./
rm -rf ../
牛に似た一種の栄養
これGNU fileutilsの初期変更ログすべての歴史的情報があります。
最初は削除または禁止されてい.
ませんが、1990年から1991年の間に最初に禁止され、次の両方が含まれていません。..
..
dir/.
その他
ご覧のように、、、zsh
(またはすべてのglob)の拡張には(またはシミュレーションモードでも).*
含まれません。したがって、組み込み関数(これを行うと取得できます)は特に扱われません。したがって、対応する組み込み機能を使用すると、その項目を消去したり削除したりすることはできません。.
..
sh
rm
zmodload zsh/files
.
..
zsh
rm -rf .
rm -rf ..
.
..
rm -rf .*
.
..
Busybox 0.52(2001)には、合計rm
削除を無効にする.
機能が追加されました。..