如何从/ dev / tcp中捕获Bash中的错误?

时间:2012-03-01 21:27:14

标签: bash tcp error-handling

我对如何使用陷阱有一个适度的理解但是在我的生活中不能弄清楚如何捕获从/ dev / tcp返回的错误。

当运行“cat< / dev / tcp / $ URL / $ PORT”,其中URL是导致“connect:Connection refused”的服务器时,我无法弄清楚如何捕获该错误。

如果在这种情况下有人对如何使用陷阱有任何见解,那将非常有帮助。我处理它的当前方式是:

if [ $? != 0 ]; then
    echo "error"
fi

这使我能够在发生错误时提交动作,但这是我知道如何处理这个特定问题的唯一方法。我知道,这不是正确的做法,但这是我唯一可以开展工作的方式。

如果有人有任何见解如何在Bash中解决这个问题会很棒。不,我不能使用netcat。

3 个答案:

答案 0 :(得分:5)

错误直接来自Bash,而不是来自cat。因此重定向运算符是无用的。

我仍在寻找消除连接错误消息的方法。

仍然可以评估错误情况:

exec 3<>/dev/tcp/${2}/${3} || {
    echo "PROBLEM"
    exit 1
}

上述测试的修改版本可能是:

#!/bin/bash

# args: #1: host, #2: port

(exec 3<>/dev/tcp/${1}/${2}) &>/dev/null
if [ $? -ne 0 ] ; then
    echo "PROBLEM"
    exit 1
fi

显然此版本不会为调用者打开fd 3,但是打算丢弃错误消息。

答案 1 :(得分:0)

Trap允许您捕获信号,但它不是我担心的一般异常管理工具。

尝试尝试的一件事就是捕获“cat”命令的输出并检查它是否包含有关错误的信息(特别是如果cat的返回值不为零)。否则,shell内部真的不太可能。

答案 2 :(得分:0)

如果要捕获整个错误,最好的方法是将整个错误重定向到文件。转向文件描述符2用于显示错误,这些错误将显示在控制台上。 采用 回声> / dev / tcp /主机/端口2>文件名 现在您的文件名有错误。 您可以使用$(cat filename)在bash脚本中读取文件

如果您不想显示错误,请重定向到/ dev / null而不是文件。