检查SSH上的命令输出零线

时间:2013-09-26 11:32:37

标签: linux bash error-handling ssh

如果我执行以下操作,并且网络已关闭,则将执行零情况,但不应该执行。

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,但是今天我发现了这个问题,在我检查后网络出现故障。

如果我从SSH命令检查返回值,那么我将始终从最后执行的awk获得返回值。

问题

我如何确保实际计算zfs输出的零行,而不是SSH连接失败的零行?

2 个答案:

答案 0 :(得分:1)

说:

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

来自manual

  

pipefail

     

如果设置,管道的返回值是最后一个的值   (最右边)命令以非零状态退出,如果全部退出则为零   管道中的命令成功退出。此选项被禁用   默认值。

答案 1 :(得分:0)

这个怎么样(ssh 之后的命令不应该在本地执行):

"$(ssh -n $host 'zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk \'{print $1}\')'"

注意我是如何单独引用ssh命令在远程计算机上运行的。还转发'的{​​{1}} awk,如\'。检查呼叫的返回值,并仅在返回成功时执行。