当前位置:  开发笔记 > 编程语言 > 正文

不支持流程替换<(...)?

如何解决《不支持流程替换<()?》经验,为你挑选了2个好方法。

在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.问题在于过程替换问题:<(...)

有人可以告诉我这里有什么不同吗?

[编辑]

谢谢你的回答!

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



1> Aaron Digull..:

语法<(...)仅由BASH支持.

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

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

if用管道移动stdin重定向.该if会传递给标准输入grep.

if tail ...| grep将无法工作,因为if无法看到它then/ fi因为管道分离进程.



2> devnull..:

您应该注意<(...)POSIX未指定进程替换().因此,如果您bash通过调用sh或使用以下内容调用它来在POSIX模式下运行:

set -o posix

然后你会发现错误!

从bash手册:

使用--posix命令行选项启动Bash 或set -o posix在Bash运行时执行' '将使Bash更加符合POSIX标准,方法是更改​​行为以匹配POSIX在Bash默认值不同的区域中指定的行为.

...

流程替换不可用.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有