为什么我要使用命令
rm -rf "`pwd`/folder"
Run Code Online (Sandbox Code Playgroud)
代替
rm -rf ./folder
Run Code Online (Sandbox Code Playgroud)
有什么理由偏爱其中之一?
rm -rf "`pwd`/folder"不好,你不应该使用它。由于极端情况,这只是不好,但这种极端情况可能会成为导致删除错误目录的安全问题。极端情况是如果当前目录以换行符结尾:命令替换/some/where/strange?删除尾随的换行符,因此如果当前目录是(其中 ? 代表换行符),则该命令将删除/some/where/strange。
该变体rm -rf "$PWD/folder"没有使用pwd命令的缺点,并且具有不受尾随换行符的极端情况影响的优点。每伯恩/ POSIX壳更新PWD变量的每个目录变更指令(后cd,pushd等),并且它具有相同的值,该值的pwd内置命令输出。(外部pwd命令可能有不同的输出,但是 1.pwd如果有一个并且所有常见的 shell 都有一个,则调用内置命令,并且 2. 无论如何在这里使用外部命令没有任何好处。)
rm -rf "$PWD/folder"rm -rf ./folder然而,没有优势。它具有理论上的缺点,rm -rf "$PWD/folder"可能会在rm -rf ./folder适合时超过最大命令行长度。然而,最大命令行长度几乎总是明显大于最大文件路径长度,因此具有单个路径的命令几乎总是适合的。
使用"$PWD/$foo"而不是"$foo"的优点是它保证不以破折号开头,因此它看起来不像一个 option。如果路径在脚本中明确拼写,这不是问题,只有当它是一个变量时。并"./$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
Run Code Online (Sandbox Code Playgroud)
如果$output_directory是相对路径,则清理代码可以在cd命令之前或之后工作,但不能同时工作。