我想检查 USB 是否繁忙并将结果存储在变量中:
$ foo=$(umount /dev/sdb1)
$ umount: /path/mounted: target is busy.
但是当我想打印时$foo
,我得到一个空变量
$ echo $foo
$
我的最终目标是卸载 USB。如果目标正忙,请使用 向用户发出警告whiptail
。所以:
$ [[ -z $foo ]] || whiptail --msbox "Cancel the operation that is maintaining your USB busy" 0 0
是否可以将错误存储target is busy
在变量上,或者我应该使用另一种技术?
答案1
程序通常将错误消息写入“标准错误”I/O 流;简称“stderr”。如果您搜索该词,您将获得数百万个结果;简短的解释是 stderr 存在,因此当“标准输出”(“stdout”)重定向时,错误消息可以并且将会显示在屏幕上,就像在假设的命令中一样
umount /dev/sdb1 > um.result.txt
你可以看到这种情况的发生;即使您尝试将错误消息捕获到变量中,该错误消息也会出现在您的屏幕上。
同样简短的答案是使用2>&1
将 stderr 流合并到 stdout 流中,因此
foo=$(umount /dev/sdb1 2>&1)
将捕获变量中的错误消息。
另一种方法,正如乔丹在评论中所建议的,就是查看退出状态。此主题的变体包括:
卸载/dev/sdb1 || 向用户投诉
如果 !卸载/dev/sdb1 然后 向用户投诉 菲
umount /dev/sdb1 2> /dev/null || 向用户投诉
foo=$(umount /dev/sdb1 2>&1) || 向用户投诉使用“$foo”