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

Ror*_*ory 17 linux bash shell mount umount

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

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

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

And*_*oss 38

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

umount .... || /bin/true
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用伪命令`:`(shell内置)而不是/ bin/true(它创建一个新进程)来加快速度.也就是说,使用"`umount .... ||:`" (8认同)
  • 这假设umount报告的错误是因为它没有安装在第一位,但是由于其他原因umount发生故障的情况呢?这可能很危险! (6认同)
  • 这是“危险的”-就像@LennartRolland所说,您不知道为什么umount在这里失败。设备实际上可能很忙,并且卸载可能已失败,请不要使用此功能!! (4认同)
  • 并将输出重定向到/ dev/null:umount ...>/dev/null 2>&1 || /斌/真 (3认同)

Dev*_*Dev 15

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

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

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

#!/bin/sh

if mountpoint -q "$1"; then
  umount "$1"
fi
Run Code Online (Sandbox Code Playgroud)

您也可以将其作为单行进行。

! mountpoint -q "$mymount" || umount "$mymount"
Run Code Online (Sandbox Code Playgroud)


Mic*_*rny 6

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

umount … || [ $? -eq 1 ]
Run Code Online (Sandbox Code Playgroud)

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

  • 我测试并卸载了返回1的退出,无论是忙还是未安装,因此无法仅根据返回代码区分这两种情况. (2认同)