Linux Bash脚本-umount一个设备,但不要';如果它';它没有上马吗?

Linux Bash脚本-umount一个设备,但不要';如果它';它没有上马吗?,linux,bash,shell,mount,umount,Linux,Bash,Shell,Mount,Umount,我正在编写一个bash脚本,并且设置了errexit,因此,如果任何命令没有返回0退出代码,即如果任何命令没有成功完成,脚本将死亡。这是为了确保我的bash脚本是健壮的 我必须安装一些文件系统,复制一些文件,安装它。我在开始处放了一个umount/mnt/temp,这样它就可以在做任何事情之前对其进行umount。但是,如果它没有挂载,那么umount将失败并停止我的脚本 是否可以执行umount——如果未安装/mnt/temp,则不会失败?如果设备未安装,它将返回0?与rm-f?一样,忽略返回

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

我必须安装一些文件系统,复制一些文件,安装它。我在开始处放了一个
umount/mnt/temp
,这样它就可以在做任何事情之前对其进行umount。但是,如果它没有挂载,那么umount将失败并停止我的脚本


是否可以执行
umount——如果未安装/mnt/temp,则不会失败?如果设备未安装,它将返回0?与
rm-f

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

umount .... || /bin/true

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

umount … || [ $? -eq 1 ]
然后,如果
umount
返回0或1(即卸载成功或设备未装载),bash将假定没有错误,但如果返回任何其他代码(例如,您没有卸载设备的权限),bash将停止脚本。

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

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

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

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

我建议使用
mountpoint
装载路径,当且仅当给定路径是装载的资源时,它返回0

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

#/垃圾箱/垃圾箱
如果装入点-q“$1”;然后
umount“$1”
fi
你也可以作为一个班轮

!mountpoint-q“$mymount”| | umount“$mymount”

并将输出重定向到/dev/null:umount…>/dev/null 2>&1 | | |/bin/trueWell,这是一种情况。很容易想象脚本想要继续,但会在日志流中留下任何错误消息。您可以使用伪命令
(一个shell内置)而不是/bin/true(创建一个新进程),从而使这一过程更快一些。也就是说,使用“
umount…..|:
”这假设umount报告的错误是因为它没有首先装入,但是如果umount由于其他原因而失败,该怎么办?这可能很危险!这很危险——就像@LennartRolland说的,你不知道umount为什么会在这里失败。设备可能正忙,并且umount可能已失败。请不要使用此选项!!在大多数情况下,使用“/bin/true”更有用,这样更容易阅读和理解它的含义这里是多余的吗?我测试了
if false | | echo 1;然后回音ok;fi
,如果为false | |{echo 1;:;},则输出与
相同;然后回音ok;fi
。我测试过,umount退出,返回1表示忙和未装载,因此无法仅根据返回代码区分这两种情况。实际上,返回代码是未能卸载的装载点的数量,至少对于util linux的
umount
。查阅