在脚本中,cd 工作目录还是前缀路径更好

在脚本中,cd 工作目录还是前缀路径更好

如果我有一个应该在指定目录中执行工作的脚本,那么最好在所有路径中添加此目录作为前缀,还是省去这个麻烦,只将其保存cd到工作目录中。例如

WORK_DIR="$1"

process data >"$WORK_DIR/result.txt"
grep "Error" "$WORK_DIR/result.txt"

或者

WORK_DIR="$1"

cd "$WORK_DIR"
process data >result.txt
grep "Error" result.txt

我知道如果我使用 运行此脚本会有差异source,但是有没有首选/方便的方法来执行此操作?

答案1

首选方法是使用前缀,我可以想到几个原因:

  1. 它更容易阅读和维护。$WORK_DIR在脚本中进行 grep 查找比搜索之前的最后一个更容易cd,尤其是当脚本很长并且您cd在脚本内执行多次时。
  2. 在您的具体示例中,如果有人决定编辑脚本并在“process”和“grep”之间添加几行,他可能会cd转到不同的目录,在这种情况下该grep行将失败。如果使用前缀,中间发生的事情并不重要。
  3. 如果在脚本运行期间有人删除并重新创建$WORK_DIR,您的脚本将位于已删除的目录中。如果您使用前缀,即使该目录被删除并重新创建,您也会写入新目录。

答案2

如果您在没有设置标志的情况下运行脚本,第二种形式是危险的-e。如果cd由于任何原因失败,则执行将继续下一行,即使工作目录没有改变。这不是您想要的,甚至可能是一个安全漏洞。

相关内容