当我输入
mv ../* .
mv: cannot move '../<dir name>' to a subdirectory of itself, './<dir name>'
shell/mv 命令如何检测到这种行为?
shell 负责扩展通配符,就像*
在传递命令行之前一样mv
,它直接这样做,仅基于存在的文件/目录,不知道程序是什么或它可能想用这些名称做什么。所以在这种情况下,../*
扩展为父目录中的每个文件/目录名称,包括当前目录<dir name>。然后mv
遍历它收到的参数列表,尝试将除最后一个之外的每个参数移到最后一个,这会导致您看到的错误。
据我所知, mv 使用rename()
POSIX 系统调用,规范说:
如果出现以下情况,rename() 函数将失败:
(...)
[EINVAL] [CX] 新目录路径名包含命名旧目录的路径前缀。
...以及无数其他详细的故障模式。
操作系统大概通过比较沿层次结构的中间目录的inode数量来实现通用VFS层的检测。