【问题标题】:Bash variable assignment strange behaviourBash变量赋值奇怪的行为
【发布时间】:2016-06-01 21:00:06
【问题描述】:

我正在尝试编写一个 bash 脚本,而这样做却被困在这里:

我不明白为什么会这样:

MSG=$(pwd)
echo $MSG

输出:

/home/harsh/source/git/trunk

但事实并非如此:

MSG=$(java -version)
echo $MSG

输出:

空白

请帮忙!

【问题讨论】:

  • java -version 从命令行运行时显示什么?添加MSG=$(java -version 2>&1) 并重试。它可能出于某种原因将信息输出到stderr。 (一些发行版将该信息输出到stdout,其他输出到stderr。)例如opensuse 13.1 使用stdout,Archlinux 使用stderr。 (可能较新的版本使用stderr
  • 在stderr中一定有什么东西打印出来说java not found
  • 虽然这些答案应该是正确的,但另一方面,您应该真正使用echo "$MSG"(即引用)来打印它并在其他情况下使用它。
  • 是的,大卫,添加 2>&1 有效!

标签: linux bash variables ubuntu variable-assignment


【解决方案1】:

有些命令最后可能需要2>&1 才能得到任何输出:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-01
      • 2012-12-16
      • 2011-04-08
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多