一尘不染

不支持流程替换<(…)吗?

linux

在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在我的情况下这是不可接受的。


阅读 227

收藏
2020-06-03

共1个答案

一尘不染

该语法<(...)仅受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因为管道分离过程。

2020-06-03