我正在最新的 arch linux 上运行 bash 5.0.007-1 和 net-snmp 5.8-2。
该行收集设备的状态:
snmpstatus -c public -v1 192.168.1.240
当设备未上电时,即网络上不存在上述IP地址时,上述命令将以下输出返回到终端:
Timeout: No Response from 192.168.1.240
如何停止在终端中显示此超时输出行并将其捕获到变量中。此外,如果设备已打开并且 IP 地址存在,则正常输出应显示在终端上,并将输出传递给同一变量。
一旦获得变量,我将对其进行解析,并根据其内容决定要做什么。
(我已经阅读了相当多的内容,包括man snmpcmd
、man smnpwalk
和 重定向,但解决方案回避了我)。
答案1
我想到了。总的来说,我遇到的问题是因为我在通过管道传输命令的输出后进行了重定向
snmpstatus -c public -v1 192.168.1.240
grep 然后 sed,在相当长的一行行的末尾。我当时没有意识到,尽管现在很明显,任何 stderr 或 stdout 的重定向都必须在相关命令之后立即发生。这很重要,因为我实际上已经找到了解决方案,并因为奇怪的不起作用而将其丢弃,因为我曾尝试在管道末端进行重定向。
以下是如何将 stderr 重定向到变量
error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error
这是语法的解释
0 = stdin
1 = stdout
2 = stderr
> = redirect
因此 2>1 意味着将 stderr 重定向到 stdout。 & 是必不可少的,因此2>&1
必须写,但在我的阅读中,我无法确定原因。
这个堆栈溢出回答非常有帮助,也是如此这个关于重定向的页面写得很好。