Pushd/popd 和 sub-shell+cd 的区别

Pushd/popd 和 sub-shell+cd 的区别

我试图了解使用以下方法是否有任何好处:

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。

当使用 subshel​​l 时,可以保证最终您将拥有原始的 CWD,无论执行如何发生。

在我早年的 bash 中,我使用了 Pushd/popd,但现在我尽可能避免使用它们。我仍然在命令行上使用它们,但不在脚本上使用它们。

编写脚本时,始终考虑最坏的情况:如果执行在当前行中断会发生什么。

相关内容