我正在编写一个bash脚本并且我设置了errexit
,因此如果任何命令没有返回0退出代码,即如果任何命令未成功完成,脚本将会死亡。这是为了确保我的bash脚本是健壮的。
我必须挂载一些文件系统,复制一些文件,然后卸载它。我在开始时放置umount /mnt/temp
,以便在做任何事情之前将其卸下。但是,如果没有安装,则umount将失败并停止我的脚本。
可以umount --dont-fail-if-not-mounted /mnt/temp
吗?如果未安装设备,它将返回0?喜欢rm -f
?
答案 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"