0

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

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

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

在这种情况下,运行udisksctl可能会产生三种结果:

在情况 1) 中,它运行成功。

在其他两种情况下,它会返回错误,但是:

  • 在案例 2)中,它给了我错误:Error looking up object for device ...
  • 在案例 3) 中,它给了我错误:Error mounting /dev/sdb1: GDBus.Error:org.freedesktop.UDisks2.Error.AlreadyMounted: Device /dev/sdb1 is already mounted at

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

像这样将错误消息传递给 grepudisksctl mount -b /dev/disk/by-label/CRUZER 2> >(grep -i "Error looking up object for device")似乎对输出没有任何影响。

4

2 回答 2

2

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

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 "$0: unexpected error $result" >&2
       exit $rc
       ;;
   esac
fi

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

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

于 2021-10-25T16:28:09.803 回答
0

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

udtmp=$(mktemp /tmp/$(basename "$0".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而且更少。

于 2021-10-25T16:29:19.387 回答