我试图了解使用以下方法是否有任何好处:
pushd my_dir
make all # ... or something else
popd
与
(
cd my_dir
make all # ... or something else
)
或者这只是一种偏好?
我想后一种表示法可能会出现像您可能需要的问题set -e
(以及其他标志),但它仍然执行最后一个命令的退出代码,并且在语法方面看起来更好。
答案1
在子 shell 中运行脚本的一部分并不总是可行或有用。
我也在脚本中使用pushd
/ popd
(没关系,因为我通常在脚本中使用 bashism),但根据我的理解,这主要是交互式 shell 的一个便利功能,并且使用子 shell 不应指望会很有趣。
答案2
pushd/popd
更容易阅读,但它们并不安全,因为如果脚本在中间被中断(正常或强制),您最终将得到更改的 CWD。
当使用 subshell 时,可以保证最终您将拥有原始的 CWD,无论执行如何发生。
在我早年的 bash 中,我使用了 Pushd/popd,但现在我尽可能避免使用它们。我仍然在命令行上使用它们,但不在脚本上使用它们。
编写脚本时,始终考虑最坏的情况:如果执行在当前行中断会发生什么。