入力すると
mv ../* .
mv: cannot move '../<dir name>' to a subdirectory of itself, './<dir name>'
shell / mvコマンドはこの動作をどのように検出しますか?
私の知る限り、mvはrename()
POSIXシステムコールを使用しています。
次の場合、rename()関数は失敗します。
(...)
[EINVAL] [CX]新しいディレクトリのパス名には、古いディレクトリに名前を付けるパスプレフィックスが含まれています。
...他の無数の詳細な故障モードと一緒に。
オペレーティングシステムは、おそらく、階層に沿った中間ディレクトリのiノード番号を比較することにより、一般的なVFS層での検出を実装します。
シェルは*
、コマンドラインを渡す前のようにワイルドカードを拡張する役割を果たしmv
、プログラムが何であるか、またはそれらの名前で何をしたいかを知らずに、存在するファイル/ディレクトリのみに基づいて直接拡張します。したがって、この場合、は、現在のディレクトリ<dir name>../*
を含む、親ディレクトリ内のすべてのファイル/ディレクトリ名に展開されます。次に、受け取った引数のリストを調べ、最後を除くすべての引数を最後に移動しようとします。これにより、表示されるエラーが発生します。mv