Bash - 命令替换 $(ping google.com) 输出到终端

Bash - Command substituting $(ping google.com) outputs to terminal

我一直在编写一个脚本,其奇怪的行为让我抓狂,但我设法找到了可能的问题所在:命令替换如下

out="$(ping google.com)"

如果在互联网不可用时完成,将其输出到终端

ping: google.com: Temporary failure in name resolution

尽管根据我的理解,被替换的命令在子 shell 中是 运行,因此命令的输出不应转到标准输出,而只能作为变量的值传递。事实上,如果在互联网可用时完成,命令替换不会像预期的那样向终端输出任何内容。

我不确定这是否是导致我的脚本出现问题的原因,因为我正在 运行 执行一个稍微复杂一些的命令 (out="$(timeout 5 ping google.com | grep -c failure)"),但我的理论是有些东西很奇怪正在发生的事情弄乱了以后的变量和替换操作。

为什么会这样?为什么只有在 ping 命令无法到达 google.com 时才会发生?谢谢你的时间。

输出不会输出到 stdout,而是输出到 stderr,并直接打印到终端。使用 out="$(ping google.com 2>&1)" 获取 out 变量中的所有输出(stderr 和 stdout),或考虑为您的命令使用退出代码。