在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
,这在我的情况下是不可接受的.
语法<(...)
仅由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
因为管道分离进程.
您应该注意<(...)
POSIX未指定进程替换().因此,如果您bash
通过调用sh
或使用以下内容调用它来在POSIX模式下运行:
set -o posix
然后你会发现错误!
从bash手册:
使用
--posix
命令行选项启动Bash 或set
-o posix
在Bash运行时执行' '将使Bash更加符合POSIX标准,方法是更改行为以匹配POSIX在Bash默认值不同的区域中指定的行为....
流程替换不可用.