取决于错误输出的条件操作
Conditional actions depending on error output
有没有办法根据命令的错误输出执行if语句?
例如,我想在安装 USB 驱动器的脚本中使用 udisksctl
,然后对驱动器内容执行一些操作。
- 驱动器没有挂载:它应该挂载它然后执行
动作。
- 驱动器不存在:它应该抛出一条错误消息并退出;
- 驱动器已经安装,它应该执行操作;
运行 udisksctl
在这种情况下可以有三种结果:
案例1)运行成功
其他两种情况returns错误,但是:
- 在情况 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 语句,该语句根据这两个错误消息采取不同的操作?
像这样将错误消息通过管道传输到 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
就更少了。
有没有办法根据命令的错误输出执行if语句?
例如,我想在安装 USB 驱动器的脚本中使用 udisksctl
,然后对驱动器内容执行一些操作。
- 驱动器没有挂载:它应该挂载它然后执行 动作。
- 驱动器不存在:它应该抛出一条错误消息并退出;
- 驱动器已经安装,它应该执行操作;
运行 udisksctl
在这种情况下可以有三种结果:
案例1)运行成功
其他两种情况returns错误,但是:
- 在情况 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 语句,该语句根据这两个错误消息采取不同的操作?
像这样将错误消息通过管道传输到 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
就更少了。