在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
一样容易)。