从长时间运行的进程到xargs的管道没有效果



在bash中,我想启动我的程序(咕噜),并使用标准错误的一部分(端口号)作为另一个程序的参数。我将stderr重定向到stdout,并使用grep和sed过滤输出。我在stdout中得到结果:

gollum -p0 2>&1|  sed  -n -e "s/.*port=//p"

它返回'56343'并继续运行,因为gollum是服务器。

但是,如果我想使用这个作为另一个程序的参数(例如echo,但我想稍后使用它来启动带有端口号的互联网导航器),则使用xargs它不起作用。

gollum -p0 2>&1|  sed  -n -e "s/.*port=//p" | xargs -n1  echo  

没有发生。你知道为什么吗?或者你有其他的想法来做同样的事情吗?

谢谢你的帮助。

如果您不希望您的服务器一直在后台运行,这很容易做到。如果需要,一种方法是使用流程替换:

#!/bin/bash
#      ^^^^- not /bin/sh; needed for >(...) syntax
gollum -p0 > >(
  while IFS= read -r line; do
    # start a web browser here, etc.
    [[ $line = *"port="* ]] && echo "${line##*port=}"
    # ...for instance, could also be:
    # open "http://localhost:${line##*port=}/"
  done
) 2>&1 &

…如果您想只读取包含port=第一行,然后在处理程序中将break从循环中取出,并在stdin退出之前处理其余部分(这与使用cat >/dev/null一样容易)。

相关内容

  • 没有找到相关文章

最新更新