You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在bash/zsh中打开长运行进程输出的URL并保留日志

问题:同时捕获Livebook日志并自动打开URL

我执行这条Docker命令启动Livebook:

docker run -p 8080:8080 -p 8081:8081 --pull always -u $(id -u):$(id -g) -v $HOME/livebooks:/data ghcr.io/livebook-dev/livebook

它的所有输出(包括启动后的访问URL)都属于stderr,示例输出如下:

latest: Pulling from livebook-dev/livebook
Digest: sha256:32095aae51bbb4ed11c4c7a9bffcd1157b9f93ec3c8b90cc3c8abe79e56c8166
Status: Image is up to date for ghcr.io/livebook-dev/livebook:latest
[Livebook] Application running at http://0.0.0.0:8080/?token=u3yt4bc43roox6ziw33joymhyvwhnyxi

这是一个长运行进程,我需要保留Ctrl+c终止它的能力,同时自动提取URL用xdg-open打开。目前使用的命令是:

docker run --rm -p 8080:8080 -p 8081:8081 \
  --pull always -u $(id -u):$(id -g) \
  -v $HOME/livebooks:/data ghcr.io/livebook-dev/livebook \
  2>&1 \
  | rg -m 1 -o 'http://.*' \
  | xargs xdg-open

但这个命令无法在shell中实时查看完整日志,想知道如何通过tee或其他方式实现**既自动打开网页,又能在shell中查看所有实时日志(包括后续输出)**的需求。


解决方案:两种可行实现方式

方案一:tee+管道过滤

docker run --rm -p 8080:8080 -p 8081:8081 \
  --pull always -u $(id -u):$(id -g) \
  -v $HOME/livebooks:/data ghcr.io/livebook-dev/livebook \
  2>&1 | tee /dev/tty | rg -m 1 -o 'http://.*' | xargs -r xdg-open

关键逻辑说明:

  • 2>&1:将stderr重定向到stdout,统一处理所有输出流
  • tee /dev/tty:把所有输出实时打印到当前终端,同时将输出继续传递给后续管道
  • rg -m 1 -o 'http://.*':仅提取第一个匹配的URL,找到后立即停止过滤
  • xargs -r xdg-open:-r参数确保没有匹配到URL时,不会执行xdg-open(避免打开空白页面)

执行后,终端会实时显示所有日志,找到URL后自动打开浏览器,且Docker进程保持前台运行,按Ctrl+c可正常终止。

方案二:进程替换后台处理URL

docker run --rm -p 8080:8080 -p 8081:8081 \
  --pull always -u $(id -u):$(id -g) \
  -v $HOME/livebooks:/data ghcr.io/livebook-dev/livebook \
  2>&1 > >(rg -m 1 -o 'http://.*' | xargs -r xdg-open)

关键逻辑说明:

  • >(...)是Bash的进程替换语法,将Docker的输出同时传递给这个后台进程
  • 终端直接显示Docker的所有实时日志,后台进程单独负责提取URL并打开浏览器
  • Docker进程保持前台状态,Ctrl+c可正常终止

内容的提问来源于stack exchange,提问作者lud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:15:05