这问题询问使用时创建目录(mv
如果目录不存在)的最佳方法。我的问题是为什么这不是 的内置功能mv
?是否有一些根本原因导致这不是一个好主意?
答案1
请记住,有不止一种实现mv
。您mv
在 Linux 上使用的源与 OSX 或 Solaris 等上的源不完全相同。 但希望他们都以同样的方式行事——这就是重点标准。可以想象,mv
实现可以为此目的添加一个选项,尽管由于处理起来非常简单,所以可能不值得,因为非常小的好处会被更严重的负面后果所抵消:利用这种非- 实现的标准选项不能移植到使用标准实现的另一个系统上/在另一个系统上持续运行。
mv
是由 POSIX 标准化这明确地将其行为与rename()
系统调用。在 ISO C 中, 的行为rename()
不是很具体,很多东西都留给实现,但是在 POSIX 下,您会注意到潜在的ENOENT
错误,指示“路径前缀的组成部分新的不存在”,以明确的术语描述预期的行为。这比含糊不清并将此类细节留给实现要好,因为后者会损害可移植性。
为了捍卫设计,在脚本上下文中,默认情况下在无效目标路径上失败可能比认为它只需要被创建。这是因为路径本身通常可能来自用户输入或配置,并且可能包含拼写错误;在这种情况下,脚本应该在此时失败并指示用户他们输入了无效路径。当然,编写代码的人可以选择实现不同的行为并创建不存在的目录,但最好由您负责执行此操作,而不是相反(负责确保调用mv
不会创建以前不存在的目录)。