为 shell 脚本包含错误清除逻辑的最佳方法是什么?
具体来说,我有一个脚本可以执行以下操作:
mount a x
mount b y
setup_thing
mount c z
do_something
umount z
cleanup_thing
umount y
umount x
Run Code Online (Sandbox Code Playgroud)
任何安装座及其do_something本身都可能会失败。例如,如果mount c z失败,我希望脚本在退出之前卸载已成功安装的安装。
我不想多次重复清理代码,也不想将所有内容包装到 if-nest 中(因为如果添加额外的安装,则必须重新缩进所有内容)。
有没有办法创建一个finally-stack之类的东西,所以上面的内容可以写成:
set -e
mount a x && finally umount x
mount b y && finally umount y
setup_thing && finally cleanup_thing
mount c z && finally umount z
do_something
Run Code Online (Sandbox Code Playgroud)
这个想法是,一旦“finally”命令被注册,它将在退出、通过或失败时执行(以相反的顺序)该命令——但是没有成功设置的东西不会被清理(因为如果安装失败,清理可能无法安全执行)。
或者换句话说,如果一切成功,那么它将按照 、 、 、 的顺序执行umount z——cleanup_thing如果umount y仅umount x失败则相同do_something。但如果 …
我在 amd64 机器上有一个 qemu-armhf chroot 环境(主要用于编译 Raspberry Pi 代码)。因此,它可以运行 armhf 和 amd64 二进制文件,但后者速度更快。
为了获得更好的速度,我在 chroot 中安装了某些软件包(例如 make)的 amd64 版本。这工作得很好,直到我需要 apt-get 一些其他的 armhf 包,并且它恰好将 make 列为依赖项,于是我得到了这个:
The following packages have unmet dependencies:
build-essential : Depends: make but it is not going to be installed
dpkg-dev : Depends: make but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
Run Code Online (Sandbox Code Playgroud)
如果我尝试建议的命令,那么它会说它想要安装make:armhf和卸载make:amd64。我不希望它这样做。我如何告诉 APTmake:armhf已经安装(因为我希望用它make:amd64来满足依赖关系)而不实际安装它?
我尝试使用, …