为什么 mkdir 默认情况下没有设置 -p 标志来允许创建嵌套目录?

为什么 mkdir 默认情况下没有设置 -p 标志来允许创建嵌套目录?

我认为没有理由不应该默认设置-p标志。mkdir

  -p, --parents     no error if existing, make parent directories as needed

据我所知,这是一个非破坏性的命令。我是否错过了有关其工作方式的一些重要内容?

其次,有没有一种简单的方法可以使其成为默认行为mkdir

答案1

当然,有人可能会争辩说,父目录创建应该是默认的,并且如果父目录不存在,可以使用一些检查选项来阻止目录创建。

但之所以会出现相反的情况,只是历史而已。基本版本为目录没有创建父目录。这就是为什么 X11 发行版附带了一个名为姆克迪耶尔它能够完成此任务:检查父目录是否存在并在必要时创建它们。

后来这个功能被添加到命令中目录在许多 UNIX 版本上(我不知道现在是否在 POSIX 标准中)。为了保持兼容性,通过打开选项标志来提供此功能:-p

为什么默认打开它会不好?脚本可能依赖目录如果父目录不存在则失败。尤其是作为用户默认创建目录树可能很危险。

例子:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

/backup在此示例中,即使文件系统未安装且父目录/backup/$(uname -n)不存在(如果默认情况相反),也会创建目录并执行备份。

经验法则:最好不要更改任何工具的默认行为。如果需要,提供允许更改默认行为的选项。

答案2

这是一个可选功能,并不总是需要的 - 特别是在脚本中。考虑脚本的以下缺点:

  • 不会报告目录已存在的事实:如果脚本应该将一些文件放入新创建的目录中,而该目录已经存在并包含文件,则脚本可能会造成很多混乱。 (稍后过滤掉脚本放置在那里的文件会很麻烦。)
  • 另一方面,某些脚本(或其中的一部分)可能依赖于先前创建的目录结构(可能由其他包/脚本创建)。例如,包安装脚本可能需要将库放入子目录中/usr/local/lib/GreatSoftware/ImportantPartOfIt,但这些库依赖于/链接到 下的内容/usr/local/lib/GreatSoftware。如果缺少此内容,脚本不应继续。

的通用行为mkdir使其变得简单和自然,因为此类情况会被报告并可以立即捕获。


如果您想始终mkdir -p在 shell 中使用,可以为其创建一个别名:

alias mkdir='mkdir -p'

(这应该转到您的.bashrc配置或您的 shell 使用的任何配置。)

答案3

我想,这就是一种哲学。裸露的目录(1)命令(不带选项)代表目录(2)系统调用,在 shell 中提供其功能,不做更多或更少的事情。

答案4

对我来说,问题在于 -p 选项的行为(如果它是默认选项)本质上是一个副作用。它通过执行您要求执行的操作之外的其他操作来增加命令的复杂性。这是另一件必须记住的看不见的事情。良好编程实践的基本规则之一是避免副作用。

现代编程语言是如此强大,以至于从语言提供的原语构建您可能需要的任何复杂命令都相对容易。这样做需要有意识地决定需要什么行为,并留下已完成的具体、可见的记录。

相关内容