【问题标题】:How to assign command output to variables with bash and read [duplicate]如何使用 bash 将命令输出分配给变量并读取 [重复]
【发布时间】:2019-11-30 07:43:02
【问题描述】:

我正在尝试将命令的输出分配给多个变量,每个输出“单词”一个。正在做(Linux 上的 bash)

echo foo bar baz | read FOO BAR BAZ
echo $FOO $BAR $BAZ

只显示空字符串。在做

read FOO BAR BAZ < <(echo foo bar barz)
echo $FOO $BAR $BAZ

按预期工作。这里有什么问题?我认为使用管道是最明显和正确的方法。

【问题讨论】:

  • 管道创建无法改变非子shell环境的shubshel​​l。我会在一分钟内将副本与答案链接起来。
  • 既然你已经有了一个工作代码,我想你只是想解释一下正在发生的事情。用户pbhd 很好地解释了它in his post。管道操作发生在子 shell 中,因此任何声明的变量都只能在其中访问。
  • This answer 解释了问题,但在 unix SE 上。当有人在 StackOverflow 上找到好的副本时,请链接它。我确定有一个。

标签: bash shell


【解决方案1】:

Mihir 回答的一个补充 -

read a b c <<< "$( echo 1 2 3 )" # a here-string

【讨论】:

    【解决方案2】:
    echo foo bar baz | read FOO BAR BAZ
    echo $FOO $BAR $BAZ
    
    

    在这种情况下,它什么也不打印。原因是管道创建了一个子shell,FOOBARBAZ 在其中获取值。

    echo foo bar baz | { read FOO BAR BAZ ;  echo $FOO $BAR $BAZ ;}
    

    试试这个,它会打印出所有变量的正确值。在这里,大括号封装了echo 命令,以便在读取变量的同一子shell 中运行。

    read FOO BAR BAZ < <(echo foo bar barz)
    echo $FOO $BAR $BAZ
    

    在这种情况下,一切都发生在同一个 shell 中,因此您会看到预期的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2012-07-16
      • 2014-01-08
      • 2016-09-08
      • 2021-06-11
      • 2012-02-02
      相关资源
      最近更新 更多