bash 中反引号的评估

Mar*_*oft 2 linux bash

我对 bash 中反引号的评估感到困惑。我以前见过这样的代码,这是有道理的:

RESULT=`whoami`
Run Code Online (Sandbox Code Playgroud)

这将whoami命令的输出存储在RESULT变量中,并确认反引号计算为其中的命令输出。但我也看到过如下代码:

if `wget google.com -T 2 -t 1 -o /dev/null`; then 
   echo "Internet ok"
fi
Run Code Online (Sandbox Code Playgroud)

这是通过尝试获取 google 主页来测试互联网连接(-t 1一次尝试,-T 2一次 2 秒超时,并重定向到,/dev/null因为它实际上并不想要输出,而只是想看看它是否成功)。代码读起来好像作者期望反引号将评估为wget命令的退出代码而不是输出。

但它确实有效。它打印Internet ok是否可以连接到 google.com,如果我将 url 更改为一些不存在的无意义 url,它不满足 if 语句并且不打印任何内容。我不明白为什么这有效。

wget使用有效和无效的 url独立运行命令在两种情况下都不会打印任何内容,只是退出代码有所不同。

我的结论是,if后跟反引号有一个特殊的构造,它返回退出代码而不是输出。我错了吗?

Tho*_*mas 5

不,反引号没有特殊含义,您甚至可以wgetif语句中没有它们的情况下运行命令。
if始终评估所遵循命令的退出代码。

可以在此处找到更全面的概述。


编辑

反引号启动在子shell 中执行的命令替换并返回退出代码。if只检查返回码,它不使用命令的输出。

要比较命令的输出,您可以使用[,它必须用 关闭],这基本上是一个测试。测试可以是任何东西

如果测试成功,您将获得退出代码 0 ( true ),否则不会返回 0 ( false ),这将再次由if.

所以你有如下想法。

if [ "`wget google.com -T 2 -t 1 -o /dev/null`" == "" ]
then 
    echo "emptY"
fi
Run Code Online (Sandbox Code Playgroud)

但这没有多大意义,因为将输出重定向到/dev/null您将始终从[ "wget google.com -T 2 -t 1 -o /dev/null获得 true " == "" ]
另一方面,检查wget命令的输出是否包含输出也没有用,忽略-o /dev/null,因为即使在错误情况下,您也会得到输出,但返回码不同。