为什么我要使用命令
rm -rf "`pwd`/folder"
代替
rm -rf ./folder
有什么理由选择其中一种而不是另一种?
答案1
rm -rf "`pwd`/folder"
很糟糕,你不应该使用它。这只是由于极端情况而造成的,但这种极端情况可能会成为导致删除错误目录的安全问题。极端情况是当前目录以换行符结尾:命令替换会删除尾随换行符,因此如果当前目录是/some/where/strange⏎
(其中 ⏎ 代表换行符),则此命令将改为删除/some/where/strange
。
与使用该命令相比,该变体rm -rf "$PWD/folder"
没有任何缺点pwd
,并且优点是它不会受到尾随换行符的极端情况的影响。每个 Bourne/POSIX shellPWD
在每个目录更改命令(cd
、等)之后都会更新变量,并且它具有与内置命令输出pushd
相同的值。 pwd
(外部pwd
命令可能有不同的输出,但是 1.pwd
如果存在内置命令并且所有常见 shell 都有一个,则调用内置命令,并且 2. 无论如何,在这里使用外部命令没有任何优势。)
rm -rf "$PWD/folder"
然而,与 相比并没有优势rm -rf ./folder
。它具有理论上的缺点,rm -rf "$PWD/folder"
可能会超过rm -rf ./folder
拟合时的最大命令行长度。然而,最大命令行长度几乎总是明显大于最大文件路径长度,因此具有单个路径的命令几乎总是适合。
使用"$PWD/$foo"
instead of的"$foo"
好处是可以保证不以破折号开头,所以不会看起来像一个选择。如果路径在脚本中明确拼写出来,那么这不是问题,只有当它是变量时。并"./$foo"
提供相同的保护。仅当是相对路径时,和"$PWD/$foo"
才是正确的。所以相比起来并没有什么优势。如上所述,如果涉及许多路径,则使用较短的相对形式可以帮助保持在命令行长度限制之下。"./$foo"
$foo
rm -rf "$PWD/$foo"
rm -rf "./$foo"
与将其存储在变量中以供以后使用相比,使用"$PWD/folder"
具有明显的好处"./folder"
:即使脚本同时更改为另一个目录,它也会继续指定相同的文件。虽然rm -rf "./folder"
完全没问题,但像这样的代码需要绝对路径:
output_directory="$PWD/output"
# If interrupted, delete the partial output.
trap 'rm -rf "$output_directory"; exit 1' HUP INT TERM
do_stuff >"$output_directory/file1"
do_more_stuff >"$output_directory/file2"
cd "$output_directory"
further_stuff file1 file2 >file3
如果$output_directory
是相对路径,则清理代码可以在cd
命令之前或之后工作,但不能同时工作。