如何在第一个命令的输出上 grep 匹配后执行命令

如何在第一个命令的输出上 grep 匹配后执行命令

我需要启动一个服务器类型的程序(http-server),它在终端中运行,并在准备好时输出它正在使用的端口。我想等到显示端口号,然后运行另一个命令,该命令也将是服务器类型的程序(运行并接受用户交互)

我几乎可以使用它

http-server | (grep -m 1 "Server runing"; interactiveProgram)

InteractiveProgram 将在 grep 匹配第一行后启动,但不会是交互式的)

答案1

我怀疑问题在于

http-server | (grep -m 1 "Server running"; interactiveProgram)

interactiveProgram的标准输入未连接到终端,而是从 的http-server标准输出通过管道传输(一旦grep完成)。

http-server | (grep -m 1 "Server running"; interactiveProgram < /dev/tty)

应该做你想做的事。

答案2

如果您将其作为管道的一部分运行,则标准输入将不会与终端连接,正如 @Stephen Kitt 已经说过的那样。但是如果你之后运行它,它在 http-server 退出之前不会运行。

解决方法是使用while-loop 并grep每行调用一次:

http-server | while read line; do
    echo "$line" | grep "Server running" && { interactiveProgram; break; }
done

相关内容