取决于错误输出的条件操作

Conditional actions depending on error output

有没有办法根据命令的错误输出执行if语句?

例如,我想在安装 USB 驱动器的脚本中使用 udisksctl,然后对驱动器内容执行一些操作。

  1. 驱动器没有挂载:它应该挂载它然后执行 动作。
  2. 驱动器不存在:它应该抛出一条错误消息并退出;
  3. 驱动器已经安装,它应该执行操作;

运行 udisksctl 在这种情况下可以有三种结果:

案例1)运行成功

其他两种情况returns错误,但是:

是否有一种优雅的方法来制作一个 if 语句,该语句根据这两个错误消息采取不同的操作?

像这样将错误消息通过管道传输到 grep udisksctl mount -b /dev/disk/by-label/CRUZER 2> >(grep -i "Error looking up object for device") 似乎对输出没有影响。

错误消息文本的分支很脆弱;文本可能会在版本之间发生变化,或者您可能会收到相似但含义不同的消息,或者输出可能会根据用户的语言环境更改为不同的语言。但是要按照您的要求进行操作,请尝试

if result=$(udiskctl mount -b /dev/disk/by-label/CRUZER 2>&1); then
  : success
else
  rc=$?
  case $result in
    *"Error looking up object for device"*)
      echo case 2;;
    *"Error mounting /dev/sdb"*)
      echo case 3;;
    *) echo "[=10=]: unexpected error $result" >&2
       exit $rc
       ;;
   esac
fi

if里面的case有点不好看;我想您可以重构它以使用 elif,但是您必须重构从失败的命令中捕获退出代码(假设您关心退出代码是什么)。

您显然可以使搜索字符串更具体或更不具体;我试图让它们相当笼统。

感谢@markp-fuso,这就是我得到的:

udtmp=$(mktemp /tmp/$(basename "[=10=]".XXXXXXXX))

udisksctl mount -b /dev/disk/by-label/CRUZER 2> $udtmp

 if grep -i "Error looking up object for device" $udtmp ; then
     exit
 elif grep -i "GDBus.Error:org.freedesktop.UDisks2.Error.AlreadyMounted" $udtmp ; then
     do something
 fi
 
 do something else

@LMC 感谢您的提醒。我想无论如何我都会使用它,因为 udiskctl 与 Thunar 配合得很好,而 mnt 就更少了。