![bash 获取命令的输出](https://linux22.com/image/224554/bash%20%E8%8E%B7%E5%8F%96%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA.png)
我尝试为 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
和 STDERR
在bash
:
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
这是命令打印到终端的主要文件描述符。