当前位置: 首页 > 面试题库 >

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

岑叶秋
2023-03-14
问题内容

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


问题答案:

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



 类似资料:
  • 问题内容: 在python中,是否有一种方法可以调用一个新进程,在同一个上下文中处理它,例如标准IO流,关闭当前进程,并控制所调用的进程?这将有效地“替代”该过程。 我有一个要重复其行为的程序。但是,它使用了一个第三方库,而且看来,我真正能够杀死该库调用的线程的唯一方法是退出()我的python进程。 另外,它似乎可以帮助管理内存。 问题答案: 您可能对以下朋友感兴趣: 这些功能都执行一个新程序,

  • 我正在将一些代码移动到Web API中,我只希望接受完美的请求(按顺序发送数据、按顺序发送所有头等),并拒绝其他请求。现在我有了它,如果一个完美的请求进来,那么它返回一个正确的输出,带有一个200 OK状态代码,如果一个错误的请求进来(也就是一个未正确欺骗的请求),那么它返回一个404 not FOUND。 我的控制器中的函数都有一个带有FromBody属性的参数,所以这意味着如果请求使用内容类型

  • 我试图使用cv::distanceTransform()函数,但在运行时出现以下错误: OpenCV错误:cvDistTransform中不支持的格式或格式组合(源图像必须为8uC1,距离贴图必须为32fC1(或在简单L1距离变换的情况下为8uC1)), 然而,我的输入垫似乎确实是CV_8U(其类型=16,深度=0,通道=3)。我的输出垫声明为CV_32FC1。违规代码: 谢谢你的帮助!

  • 在段落和多列表中用apache-poi替换ms word merge-fields with values。 由于docx4j提供了替换合并字段的功能,apache POI是否有任何等效的功能。由于我使用的是Docx文件中的一些自定义标记,所以在docx4j中读取该文件是在忽略自定义标记(xml格式“w:xyz”)。

  • 我知道JPA支持流,但为了防止实体管理器占用大量内存,我必须显式地执行。 我想它应该在他们的spring-data-commons中,但是https://spring.io/projects/spring-data#learn没有任何链接,只有标签。

  • 我试图将Spring Cloud Stream与本主题中描述的功能一起使用。但是它不起作用。 我的职能: 我推送消息。通过使用输出注释制作的生产者,发送到consumer-in-0频道: 我的yaml通道配置: 如果我通过配置使用消费者,一切正常。同样在rabbitmq管理器中,我看到生产者正在工作并发送消息,但消费者并不使用它们。帮帮我,请某人帮忙。 附言:我也使用Spring WebFlux