如果我做了以下事情,并且networkingclosures,那么将执行零个案例,而不应该这样做。
case "$(ssh -n $host zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk '{print $1}')" in 0) # do something ;; 1) # do something else ;; *) # fail esac
在脚本的早些时候,我检查我可以SSH到$host
,但今天我发现这个问题,在我的networking检查后失败。
如果我检查SSH命令的返回值,那么我将始终从awk
获取返回值,因为它是最后执行的。
题
我如何确保我实际上计数了zfs
输出的零线,而不是从失败的SSH连接中零线?
说:
set -o pipefail
在脚本的开头(或者在case
语句之前)。
而且,在执行case
语句之前检查命令的返回码:
set -o pipefail $value=$(ssh -n $host zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk '{print $1}') if [ $? == 0 ]; then case $value in ... esac fi
从手册 :
pipefail
如果设置,管道的返回值是以非零状态退出的最后一个(最右边的)命令的值,如果管道中的所有命令都成功退出,则为零。 该选项默认是禁用的。
怎么样(ssh之后的命令不应该在本地执行):
"$(ssh -n $host 'zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk \'{print $1}\')'"
注意我如何单引号命令ssh在远程机器上运行。 也逃脱了'
像awk
一样\'
。 检查呼叫的返回值,并仅在返回成功时执行。