bash 获取命令的输出

bash 获取命令的输出

我尝试为 macOS 制作一个脚本来通知我可用的软件更新:

result=$(softwareupdate -l)
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi

但重要的一行不包括在内。结果:

result=$(softwareupdate -l)
softwareupdate -l
++ softwareupdate -l

No new software available.
+ result='Software Update Tool
Finding available software'

if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
echo $result
++ echo Software Update Tool Finding available software
+ [[ Software Update Tool Finding available software = *\N\o\ \n\e\w\ \s\o\f\t\w\a\r\e\ \a\v\a\i\l\a\b\l\e\.* ]]

该行:“没有可用的新软件。”不包含在变量中。为什么?

答案1

因为输出打开STDERR错误文件描述符输出。

我会做什么,结合STDOUT STDERRbash

if softwareupdate -l 2>&1 | grep -q "No new software available"; then
    echo "Nothing to do"
else
    echo "Update available"
fi

如果您想保留大部分代码并[[ ]]与字符串匹配一起使用,请使用:

result=$(softwareupdate -l 2>&1)
if [[ $result == *"No new software available"* ]]; then
    [...]

您可以使用bash 4.0+ 来|&代替。 2>&1 |macOS 上的默认 bash 太旧而无法支持|&,因此您需要使用2>&1 |,或安装更新的bash,例如使用 Homebrew:

brew install bash

这段代码使用布尔逻辑:

您可以直接测试 grep 命令或其他命令,因为它们返回 0 表示 true 或 > 0 表示 false。


STDERR:

这是命令打印到终端的辅助文件描述符。它适用于默认情况下不应解析的消息。重定向到标准错误:>&2

STDIN:

标准输入是命令可以从中读取输入的文件描述符。

STDOUT

这是命令打印到终端的主要文件描述符。

相关内容