我有以下代码:
#!/bin/bash
read -t1 < <(stat -t "/my/mountpoint")
if [ $? -eq 1 ]; then
echo NFS mount stale. Removing...
umount -f -l /my/mountpoint
fi
如何在同时仍然能够在后续测试中检测到其错误级别时静音stat的输出?
在子shell中或在读取行的末尾添加>/dev/null 2>&1
不起作用。但必须有办法......
感谢您对此有任何见解!
答案 0 :(得分:3)
不要从进程替换中读入,而是考虑使用命令替换。例如:
mountpoint=$(stat -t "/my/mountpoint" 2>&1)
这会通过将标准输出存储在变量中来使输出静音,但可以通过解除引用 $ mountpoint 来检索结果。此方法还可以通过 $?来访问退出状态。
或者,您可以更简单地将其重写为:
mountpoint="/my/mountpoint"
if stat -t "$mountpoint" 2>&-
then
echo "NFS mount stale. Removing..."
umount -f -l "$mountpoint"
fi
对我来说,这似乎更有意思,更不容易出错,但你的里程肯定会有所不同。
在评论中,OP询问是否可以滥用读取超时来处理来自 stat 的挂起输入。答案是肯定的,如果您关闭标准错误并检查空 $ REPLY 字符串。例如:
mountpoint="/my/mountpoint"
read -t1 < <(stat -t "$mountpoint" 2>&-)
if [[ -n "$REPLY" ]]; then
echo "NFS mount stale. Removing..."
umount -f -l "$mountpoint"
fi
这有几个原因:
如果没有提供NAME,读取的行将存储在REPLY变量中。
答案 1 :(得分:0)
我想我明白了!您的响应中提到的重定向似乎在子shell中工作,而不会像2&gt;&amp; 1那样消除返回代码。所以这可以按预期工作:
read -t1 < <(rpcinfo -t 10.0.128.1 nfs 2>&-)
if [ $? -eq 0 ]; then
echo "NFS server/service available!"
else
echo "NFS server/service unavailable!"
fi
其中10.0.128.1是“坏”IP(没有服务器/服务响应)。该脚本在一秒内超时并产生“NFS服务器/服务不可用!”响应,但没有来自rpcinfo的输出。同样,当IP良好时,输出所需的响应。
我赞成你的回复!