【问题标题】:Why do I get errors when using > > in bash?为什么在 bash 中使用 > > 时会出错?
【发布时间】:2012-11-10 03:13:00
【问题描述】:

我今天一直在查找一些 bash 的东西,我尝试过的一些 sn-ps 包括 > >,这似乎是我收到错误的原因。

Example snippet:

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)

这就是我正在使用的东西。

$ bash --help
GNU bash, version 3.2.48(1)-release-(x86_64-apple-darwin12)

编辑
以下是我遇到的错误:

file.sh: line 14: syntax error near unexpected token `>'
file.sh: line 14: `command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)'

【问题讨论】:

  • 你到底想做什么?什么是命令?你想用'> >'做什么?
  • 对,我知道>>>。我真的不明白> > 应该做什么,但我今天在谷歌搜索中看到了好几次,它是由具有很高声誉的人发布的,人们对代码进行了投票等等。该特定行应该为错误着色。您可以点击Example snippet链接了解更多信息。
  • 您遇到了什么错误?这种语法没有错。 2> 重定向标准输出。 >(...) 被替换为进入子进程的可写管道的名称,因此它很像 |,但带有括号。
  • 顺便说一下,>() 语法记录在 bash 手册中:gnu.org/software/bash/manual/bashref.html#Process-Substitution。恕我直言,阅读 bashref.html 会比谷歌搜索随机人们的随机 cmets 更好地利用您的时间。但是YMMV。
  • 你在file.sh的开头使用#!/bin/bash还是#!/bin/sh?第一个是正确的(可能);第二个将运行不同的 shell 程序或导致 bash 尝试与 sh 兼容。

标签: bash


【解决方案1】:

根据this question 的回答,Mac OS X 的 Bash 3.2.48 在进程替换方面存在一些限制;它在某些情况下支持它,但在其他情况下不支持。您的情况显然不是。

引用那里最好/最有帮助的答案:

来自 macports 的那个(4.2.37——通常是/opt/local/bin/bash,如果你安装了它)工作正常。 [...] 也许你可能想在这个脚本中使用 macports bash。

【讨论】:

  • 在我拥有的版本 3.2.48(1)-release (x86_64-apple-darwin11) 中似乎可以正常工作,几乎但不完全相同。
【解决方案2】:

解决您的问题的最天真的方法如下:

while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done < <( { command > /dev/null ; } 2>&1 )

我们将command 中的所有stdout 发送到/dev/null,然后将stderr 重定向到stdin

或者反过来:

{ command > /dev/null ; } 2>&1 | while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done

使用这些方法,您不必过多地使用文件描述符!

完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 2010-10-18
    • 2021-10-02
    • 1970-01-01
    • 2015-11-06
    • 2021-06-26
    • 2021-09-03
    • 2021-09-16
    相关资源
    最近更新 更多