19

我正在编写一个 bash 脚本并且我已经errexit设置,所以如果任何命令没有返回 0 退出代码,即如果任何命令没有成功完成,脚本就会死掉。这是为了确保我的 bash 脚本是健壮的。

我必须挂载一些文件系统,复制一些文件,然后卸载它。我umount /mnt/temp在开头放了一个,这样它会在做任何事情之前卸载它。但是,如果未安装,则 umount 将失败并停止我的脚本。

有可能做一个umount --dont-fail-if-not-mounted /mnt/temp吗?如果设备未安装,它会返回 0 吗?喜欢rm -f

4

4 回答 4

42

忽略返回码的标准技巧是将命令包装在一个布尔表达式中,该表达式总是计算为成功:

umount .... || /bin/true
于 2009-09-04T10:09:46.433 回答
8

假设您umount在未安装设备时返回 1,您可以这样做:

umount … || [ $? -eq 1 ]

如果返回 0 或 1(即卸载成功或设备未安装),bash 将假定没有错误,但如果umount返回任何其他代码(例如,您没有卸载设备的权限),它将停止脚本。

于 2009-09-04T10:15:21.650 回答
4

我刚刚发现“:”更有用并想要一个类似的解决方案,但让脚本知道发生了什么。

umount ...... || { echo "umount failed but not to worry" ; : ; } 

尽管 umount 失败,但该消息返回 true。

于 2012-06-26T11:57:57.243 回答
3

忽略退出代码并不安全,因为它无法区分已经卸载的内容和卸载已安装资源的失败。

我建议测试该路径是否已安装,mountpoint当且仅当给定路径是已安装资源时才返回 0。

如果未安装给定路径,此脚本将以 0 退出,否则将给出退出代码umount

#!/bin/sh

if mountpoint -q "$1"; then
  umount "$1"
fi

你也可以作为一个班轮来做。

! mountpoint -q "$mymount" || umount "$mymount"
于 2021-03-07T05:38:52.523 回答