shell 脚本中首先 Cd 进入目录然后执行命令或写入完整路径的更快或被认为更好的做法是什么?例如: 是先写cd /directory1/
然后mkdir subdirectory/
还是比较好mkdir /directory1/subdirectory/
。
如果您需要在一个目录中执行一些命令(在上面的示例中创建几个子目录),那么答案会改变吗?
当你说它mkdir /directory1/subdirectory/
实际上是在做cd /directory1/
还是mkdir subdirectory/
没有做时?
mkdir 只是一个示例,但问题可以适用于很多类似的命令。
答案1
这确实是由您决定的事情。可能影响该决定的因素可能是它是否美观或是否可读。就执行速度而言,这不会产生太大的差异。
可以在预先存在的目录下创建三个子目录/path/to/dir
:
mkdir /path/to/dir/a \
/path/to/dir/b \
/path/to/dir/b
( cd /path/to/dir && mkdir a b c )
(子shell允许你跳cd
回到原来的工作目录)
使用知道大括号扩展的 shell(这本质上与cd
上面的 -less 版本相同,因为 shell 会在调用之前扩展大括号扩展mkdir
):
mkdir /path/to/dir/{a,b,c}
该mkdir
实用程序可能会使用mkdir()
C 库函数。在创建它要创建的目录之前,此函数不会更改工作目录1。
当您执行关心在特定工作目录中执行的脚本时,情况会有所不同。如果脚本期望使用当前工作目录之外的相对路径查找文件,那么显然您必须在运行命令之前确保工作目录是正确的,可能使用
( cd directory && thescript )
...除非脚本自己执行此操作。
1稍作修正:在 Linux 上,命令mkdir -p a/b/c
将要调用mkdir("a")
, chdir("a")
, mkdir("b")
, chdir("b")
, mkdir("c")
, 而在 OpenBSD 上它只会调用mkdir("a")
, mkdir("a/b")
, mkdir("a/b/c")
。在 Linux 上,创建额外的单个目录a/b/c/d
只会mkdir a/b/c/d
调用mkdir("a/b/c/d")
.
因此,在 Linux 上,在创建目录时mkdir -p
确实会在内部对每个中间路径“执行一次”(而使用 no则不会执行此操作)。cd
mkdir
-p
-p
该实用程序的标志会mkdir
导致它创建任何丢失的中间目录,显然 BSD 和 Linux 开发人员的做法略有不同。
答案2
对目录执行 a 操作chdir
,然后使用短名称访问该目录中的文件比使用文件的绝对路径名要快得多。
另一方面:如果您位于特定目录中并且喜欢调用具有位于不同目录中的许多文件名参数的命令,那么使用绝对路径名会更安全且更容易理解。
顺便说一句:如果您想创建更长的目录路径 ( a/b/c/...
) 并希望确保该列表中的每个目录在命令准备好后都被授予存在,那么最好创建一个目录,chdir 到该目录中,然后继续下一个目录。这允许创建如此长的目录路径,即使路径长于PATH_MAX
.