Bash脚本 - 卸载设备,但如果没有安装,请不要失败?

时间:2009-09-04 10:05:19

标签: linux bash shell mount umount

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

我必须挂载一些文件系统,复制一些文件,然后卸载它。我在开始时放置umount /mnt/temp,以便在做任何事情之前将其卸下。但是,如果没有安装,则umount将失败并停止我的脚本。

可以umount --dont-fail-if-not-mounted /mnt/temp吗?如果未安装设备,它将返回0?喜欢rm -f

4 个答案:

答案 0 :(得分:34)

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

umount .... || /bin/true

答案 1 :(得分:6)

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

umount … || [ $? -eq 1 ]

如果umount返回0或1(即卸载成功或未安装设备),则bash将不会出现错误,但如果返回任何其他代码将停止脚本(例如,您无权卸载装置)。

答案 2 :(得分:3)

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

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

虽然umount失败,但对于消息返回true。

答案 3 :(得分:2)

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

我建议测试路径是否使用 mountpoint 挂载,当且仅当给定的路径是已挂载的资源时返回 0。

如果给定的路径没有挂载,这个脚本将以 0 退出,否则它会给出来自 umount 的退出代码。

#!/bin/sh

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

您也可以将其作为单衬。

! mountpoint -q "$mymount" || umount "$mymount"