【问题标题】:Doesn't sh support process substitution <(...)?sh 不支持进程替换 <(...) 吗?
【发布时间】:2013-09-09 00:04:13
【问题描述】:

在 Centos 6 机器上,这是可行的:

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

这不是:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

我明白了:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

别管 grep 和 tail。问题在于进程替换的东西:&lt;(...)

谁能告诉我这里的 sh 有什么不同?

[编辑]

感谢您的回答!

使用 capistrano 进行部署时出现问题。它默认使用 sh 但我现在将其更改为 bash。 我无法进行正常管道的原因是当使用tail -F | grep -q --line-buffered 时,grep 不会在匹配后立即退出。必须再对文件进行一次编辑,例如 echo "" &gt;&gt; catalina.out,这在我的情况下是不可接受的。

【问题讨论】:

    标签: linux bash sh


    【解决方案1】:

    语法 &lt;(...) 仅受 BASH 支持。

    对于任何 POSIX shell,请使用以下方法:

    sh -c 'tail -n 1000 -F catalina.out | if grep -qP --line-buffered ".+" ; then ...'
    

    即使用管道将标准输入重定向移动到 if 前面。 if 会将标准输入传递给 grep

    if tail ...| grep 不起作用,因为 if 将无法看到它是 then/fi,因为管道分隔了进程。

    【讨论】:

    • if tail ... | grep ... ; then ... fi 在 posix 模式下的 dash 和 bash 中为我工作。
    • 它在 ksh 中工作。 sh 在我的系统上是 dash 或 bash 在 posix 模式下。
    • @choroba:很有趣。我很确定它在带有 Korn Shell 的 Solaris 中不起作用。
    • @AaronDigulla,嗯?即使在 1970 年代的 Bourne 中,也支持在 if 语句的条件子句中使用管道;我敢肯定,每一个现存的 ksh 版本都会支持它——而且 ksh93 支持进程替换,所以即使是 OP 的原始代码也会很好。
    【解决方案2】:

    您应该注意,POSIX 没有指定进程替换 (&lt;(...))。因此,如果您在 POSIX 模式下运行 bash,通过使用 sh 调用它或说:

    set -o posix
    

    然后你会发现错误!

    来自bash manual

    使用 --posix 命令行选项启动 Bash 或执行 ‘set -o posix' 当 Bash 运行时,将导致 Bash 通过更改行为以匹配它来更接近于 POSIX 标准 由 POSIX 在 Bash 默认值不同的区域指定。

    ...

    进程替换不可用。

    【讨论】:

      【解决方案3】:

      还请注意,如果 Bash is invoked with the name sh,它会尽可能地模仿 sh 的历史版本的启动行为,同时也符合 POSIX 标准。

      如果您的 sh 实际上是 bash 的链接,那么这就是造成这种情况的原因。

      运行sh --version; sh -c ': &lt;(echo a)' 应该会给你足够的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 2016-06-14
        相关资源
        最近更新 更多