【问题标题】:Redirecting command output to variable as well as console in bash not working将命令输出重定向到变量以及bash中的控制台不起作用
【发布时间】:2019-06-03 11:21:11
【问题描述】:

我有一个简单的任务要在 shell 脚本中完成 - 将命令输出重定向到变量以及标准输出。我已经通过redirect command output into variable and standard output in ksh,并想出了:

VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee > /proc/$$/fd/1)

但是以上对我不起作用。输出显示在STDOUT 上很好,但它没有保存在VAR1 中。我在这里错过了什么?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    您对该 tee 命令进行了不必要的重定向。使用:

    VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /proc/$$/fd/1)
    

    他们tee 的工作原理是将其输入复制到其输出,以及您将其名称作为参数提供的任何文件。重定向只是通过传递行为发送消息。

    你可以做的其他事情——因为我们不是在这里讨论一些长时间运行的命令——首先设置变量,然后打印它的值:

    VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' )
    echo "$VAR1"
    

    ...简单得多:-)

    【讨论】:

      【解决方案2】:

      将命令输出重定向到变量以及 bash 中的控制台:

      你可以使用这个技巧:

      var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/tty)
      

      或

      var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/stderr)
      

      tee 命令会将输出写入您当前的终端/dev/tty。

      还建议您避免使用所有大写变量名称以避免覆盖环境变量。

      PS:这两个命令都适用于我在 OSX 和 Ubuntu 上。

      【讨论】:

      • 您是否检查过输出是否正常工作。我原来的问题仍然存在。 var1 没有保存输出
      • 将输出直接发送到/dev/tty 使得无法通过管道或重定向标准输出。
      • @anubhava 不,它对我不起作用。我在KSH。输出仅显示在STDOUT 上,但未保存在VAR1 变量中
      • @anubhava 即使对于 bash,它对我也不起作用。当我说 KSH 时,我的意思是,只有当我从我的 shell(默认 shell)运行上述行时。
      • @anubhava 但即使在 bash 脚本中也不起作用
      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 2013-04-27
      • 2019-02-13
      • 2013-11-14
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多