如果我有一个应该在指定目录中执行工作的脚本,那么最好在所有路径中添加此目录作为前缀,还是省去这个麻烦,只将其保存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
首选方法是使用前缀,我可以想到几个原因:
- 它更容易阅读和维护。
$WORK_DIR
在脚本中进行 grep 查找比搜索之前的最后一个更容易cd
,尤其是当脚本很长并且您cd
在脚本内执行多次时。 - 在您的具体示例中,如果有人决定编辑脚本并在“process”和“grep”之间添加几行,他可能会
cd
转到不同的目录,在这种情况下该grep
行将失败。如果使用前缀,中间发生的事情并不重要。 - 如果在脚本运行期间有人删除并重新创建
$WORK_DIR
,您的脚本将位于已删除的目录中。如果您使用前缀,即使该目录被删除并重新创建,您也会写入新目录。
答案2
如果您在没有设置标志的情况下运行脚本,第二种形式是危险的-e
。如果cd
由于任何原因失败,则执行将继续下一行,即使工作目录没有改变。这不是您想要的,甚至可能是一个安全漏洞。