在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和尾巴。问题在于流程替换很麻烦:<(...)
<(...)
有人可以告诉我sh在这里有什么不同吗?
[编辑]
感谢您的回答!
使用 capistrano 进行部署时出现了问题。它默认使用 sh, 但是我现在将其更改为 bash 。我无法进行常规配管的原因是,使用时tail -F | grep -q --line- buffered,grep不会在比赛后立即退出。必须对该文件再进行一次编辑,echo "" >> catalina.out在我的情况下这是不可接受的。
tail -F | grep -q --line- buffered
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
grep
if tail ...| grep不会起作用,因为if将无法看到它的then/ fi因为管道分离过程。
if tail ...| grep
then
fi