我看不出为什么默认情况下不应该设置-p
标志mkdir
。
-p, --parents no error if existing, make parent directories as needed
从我所见,这是一个非破坏性的命令。我是否错过了一些重要的工作方式?
其次,有没有一种简单的方法可以使它成为默认行为mkdir
?
mkdp
我看不出为什么默认情况下不应该设置-p
标志mkdir
。
-p, --parents no error if existing, make parent directories as needed
从我所见,这是一个非破坏性的命令。我是否错过了一些重要的工作方式?
其次,有没有一种简单的方法可以使它成为默认行为mkdir
?
mkdp
Answers:
这是一项可选功能,并非总是需要的-特别是在脚本中。考虑脚本的以下缺点:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
,但是库依赖于/链接到的内容/usr/local/lib/GreatSoftware
。如果缺少此脚本,则脚本不应继续。通用行为mkdir
使它变得轻松自然,因为据报道这种情况并可以立即发现。
如果要始终mkdir -p
在外壳中使用,可以为其命名:
alias mkdir='mkdir -p'
(这应该转到您.bashrc
或您的shell使用的任何配置。)
alias mkdp="mkdir -p"
。
.bashrc
不会(通常)影响其环境。
alias rm='rm -i'
。
rm -i
别名总是不好的-尽管可能会导致不良习惯。当然,并非所有命令别名都一样好/坏-考虑ls="ls --color=auto"
或ssh="TERM=xterm ssh"
举例。
当然,有人可能会争辩说父目录创建应该是默认目录,如果父目录不存在,可以使用某些检查选项来阻止目录创建。
但是,相反的原因仅仅是历史。mkdir的基本版本未创建父目录。这就是X11发行版附带一个名为mkdirhier的命令的原因,该命令能够完成此任务:检查父目录是否存在,并在必要时创建它们。
稍后,此功能已添加到许多UNIX版本的命令mkdir中(现在不知道它是否在POSIX标准中)。为了保持兼容性,可以通过打开选项标志来使此功能可用-p
。
为什么默认启用它不好?如果父目录不存在,脚本可能依赖于mkdir失败。特别是作为root用户时,默认情况下创建目录树可能很危险。
例:
if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
then
perform_backup ...
在此示例中,即使默认情况下是相反的方式,也将创建目录并执行备份,即使/backup
未安装文件系统且父级/backup/$(uname -n)
不存在。
经验法则:最好不要更改任何工具的默认行为。如果需要,请提供允许更改默认行为的选项。
在开始时,只有光秃秃的mkdir
命令。根据Unix的设计原则,此简单命令执行一项简单任务:创建目录。
后来,mkdir
获得了一个-p
选项来处理一个常见的用例,在该用例中,调用者要创建零个,一个或多个目录以确保存在特定路径。由于多种原因,未将其设为默认操作。首先,并非所有系统都具有更复杂的功能,并且要求使用该-p
选项意味着使用该功能的脚本会收到合理的错误消息(类似mkdir: invalid option -z
),而不是偶尔无法创建目录。其次,也是最重要的mkdir -p
是,的行为并非mkdir
在所有情况下都是兼容的替代品。
特别是在大多数文件系统上,mkdir
是原子操作。如果程序运行mkdir playground
并且命令成功执行,则程序将知道它已创建playground
目录。这使程序可以将新目录视为其独占场所:如果同一程序的另一个实例正在同时运行,则其调用mkdir playground
将失败。显然没有提供此属性,mkdir -p
因为它允许参数存在。
如果mkdir -p
从一开始就存在,则可以将其设置为默认模式,例如mkdir -a
单目录创建命令。但这并不会遵循通常的Unix设计哲学:大多数基本实用程序都是围绕基本基元的简单包装,其行为奇特(如一次性创建多个目录)需要一些高级选项。
alias mkdir="mkdir -p"
。