Bash 变量赋值的奇怪行为

Bash variable assignment strange behaviour

我正在尝试编写一个 bash 脚本,但在编写时卡在了此处:

我不明白为什么会这样:

MSG=$(pwd)
echo $MSG

输出:

/home/harsh/source/git/trunk

但事实并非如此:

MSG=$(java -version)
echo $MSG

输出:

空白

请帮忙!

错误消息通常写入标准错误流 stderr 而不是标准输出流 stdout。如果 java -version 生成错误而不是您预期的错误(打印版本),它可能会对 stderr 这样做。版本信息也可能打印到 stderr.

命令替换 $()stdout 获取 $() 中内容的输出并将其替换到它的位置。如果出现错误,这可能没什么。如果您从终端输入此内容,您应该仍会在终端中看到来自 javastderr 的任何输出(例如错误消息)。

某些命令可能需要在末尾 2>&1 才能获得任何输出:

MSG=$(java -version 2>&1)

它将任何标准错误(2) 发送到重定向标准输出(1) 的任何位置。