0

当我输入

mv ../* . 
mv: cannot move '../<dir name>' to a subdirectory of itself, './<dir name>'

shell/mv 命令如何检测到这种行为?

4

2 回答 2

1

shell 负责扩展通配符,就像*在传递命令行之前一样mv,它直接这样做,仅基于存在的文件/目录,不知道程序是什么或它可能想用这些名称做什么。所以在这种情况下,../*扩展为父目录中的每个文件/目录名称,包括当前目录<dir name>。然后mv遍历它收到的参数列表,尝试将除最后一个之外的每个参数移到最后一个,这会导致您看到的错误。

于 2011-01-24T21:54:03.610 回答
1

据我所知, mv 使用rename()POSIX 系统调用,规范说:

如果出现以下情况,rename() 函数将失败:

(...)

[EINVAL] [CX] 新目录路径名包含命名旧目录的路径前缀。

...以及无数其他详细的故障模式。

操作系统大概通过比较沿层次结构的中间目录的inode数量来实现通用VFS层的检测。

于 2011-01-24T21:49:16.290 回答