当我输入
mv ../* .
mv: cannot move '../<dir name>' to a subdirectory of itself, './<dir name>'
shell / mv命令如何检测此行为?
答案 0 :(得分:1)
据我所知,mv使用rename()
POSIX系统调用,规范说明了这一点:
如果出现以下情况,则rename()函数将失败:
(...)
[EINVAL] [CX]新目录 pathname包含路径前缀 命名旧目录。
......以及无数其他详细的失败模式。
操作系统可能通过比较层次结构中间目录的inode编号来实现一般VFS层的检测。
答案 1 :(得分:1)
在将命令行传递给*
之前,shell负责扩展mv
之类的通配符,并且它只根据存在的文件/目录直接执行,而不知道程序是什么或者它可能想用这些名字做什么。因此,在这种情况下,../*
将扩展到父目录中的每个文件/目录名称,包括当前目录&lt; dir name&gt; 。然后mv
遍历它收到的参数列表,尝试将除最后一个之外的每个参数移动到最后一个,这会导致您看到的错误。