加强版curl编写 curlv:在浏览器里查看 curl 的响应curlv是对curl命令的一层小封装:发出网络请求后,不再把响应糊在终端里,而是自动整理好丢进浏览器查看。一、为什么写这个(历史背景)用curl在终端里看响应,体验很差,核心问题是展示不清如果用postman来执行又会操作繁琐:JSON 挤成一行:接口返回的 JSON 默认不换行、不缩进,一坨文本糊在终端,想找某个字段得瞪半天。HTML 变乱码墙:curl一个网页,满屏标签源码滚过去,看不出页面长什么样。长内容刷屏:响应一长就把之前的终端记录顶没了。转义字符不还原:中文常显示成\uXXXX这种转义形式,不直观。一句话总结:curl擅长「拿数据」,不擅长「给人看」。curlv补的就是给人看这一段——把响应交给浏览器,该缩进的缩进,该渲染的渲染。二、装好后能怎么用(先看效果)装好之后,你平时怎么敲curl,就怎么敲curlv,只是把响应从终端搬到了浏览器:curlv https://api.github.com/repos/anthropics/anthropic-sdk-python# 浏览器弹出美化后的 JSONcurlv https://example.com# 浏览器渲染出网页详细案例见第六节。三、先搞懂两个概念:PATH 和 ~/.zshrc如果你从没配置过命令行,这两个概念是理解后面步骤的前提,一分钟讲清。PATH 是什么?你在终端敲curl、git时,系统怎么知道去哪找这个程序?靠的是一个叫PATH的目录清单。系统会挨个翻清单里的目录,找到同名的可执行文件就运行。所以:只要把我们的脚本放进 PATH 里的某个目录,curlv就能像curl一样随处敲。~/.zshrc 是什么?它是你每次打开终端时,系统自动读取的一个启动配置文件(~代表你的用户主目录)。你想让某个设置永久生效、每次开终端都在,就写进这个文件。给 PATH 增加一个目录,就是写在这里。我们要用哪个目录?~/.local/bin—— 这是 macOS/Linux 上约定俗成的放个人小工具的目录。我们把curlv脚本放进去,再确保这个目录在 PATH 里即可。四、安装步骤(照着做)第 1 步:创建存放目录mkdir-p~/.local/bin-p的意思是目录已存在也不报错,所以这条命令随便跑,安全。第 2 步:创建脚本文件把下面整段原样复制到终端回车。它会把脚本内容写入~/.local/bin/curlv这个文件:cat~/.local/bin/curlvEOF #!/usr/bin/env bash # curlv url [其它 curl 参数] —— 发请求并在浏览器里查看响应 set -euo pipefail if [[ $# -eq 0 ]]; then echo 用法: curlv url [其它 curl 参数] 2 exit 1 fi out$(mktemp -t curlv) body$out.body html$out.html # 抓响应体到文件,同时用 -w 拿到 Content-Type ctype$(curl -sSL -o $body -w %{content_type} $) \ || { echo curl 请求失败 2; exit 1; } if [[ $ctype text/html* ]]; then cp $body $html # 本身是网页,直接用 elif [[ $ctype application/json* ]] command -v python3 /dev/null; then { # JSON:美化 转义 包进 pre printf !doctype htmlmeta charsetutf-8body stylefont:14px/1.6 monospace;padding:16pxpre python3 -m json.tool --no-ensure-ascii $body | sed s//\amp;/g; s//\lt;/g; s//\gt;/g printf /pre } $html else { # 其它:原样转义后展示 printf !doctype htmlmeta charsetutf-8body stylefont:14px/1.6 monospace;padding:16pxpre sed s//\amp;/g; s//\lt;/g; s//\gt;/g $body printf /pre } $html fi open $html # macOS:默认浏览器打开 EOF说明:cat 文件 EOF ... EOF是一种把中间这段文字写进文件的标准写法,EOF只是结束标记。第 3 步:给脚本可执行权限chmodx ~/.local/bin/curlv新建的文本文件默认不能当程序运行,chmod x就是给它可执行许可。漏了这步会报 permission denied。第 4 步:确认 ~/.local/bin 在 PATH 里,不在就加上先检查:echo$PATH|tr:\n|grep-q$HOME/.local/binecho已在 PATH||echo不在 PATH,需要第 5 步如果输出已在 PATH:跳过第 5 步,直接去第 6 步。如果输出不在 PATH:做下面第 5 步。第 5 步(仅当上一步提示不在 PATH)把目录加进 ~/.zshrcechoexport PATH$HOME/.local/bin:$PATH~/.zshrc这行的作用:每次开终端时,把~/.local/bin加到 PATH 清单最前面。是追加到文件末尾,不会覆盖你原有内容。第 6 步:让配置生效并验证source~/.zshrc# 让刚改的配置立刻生效(或直接重开一个终端标签)whichcurlv# 应输出 /Users/你的用户名/.local/bin/curlvwhich能打印出路径,就说明装好了。五、实现原理整体三步:抓响应 → 按内容类型转成 HTML → 交给浏览器。text/htmlapplication/json其它curlv [参数]curl -sSL -o body -w %{content_type}抓响应体 拿 Content-TypeContent-Type?原样作为网页python3 -m json.tool 美化 转义 包进 pre转义后包进 pre写成 .html 文件open → 默认浏览器打开关键代码落点:curl -o $body -w %{content_type} $:-o把响应体存文件供渲染;-w %{content_type}把服务器返回的类型打出来,作为分支依据;$把你传的参数原样交给 curl,所以参数和 curl 一致。按类型分三路:HTML 直接用;JSON 用python3 -m json.tool --no-ensure-ascii美化(--no-ensure-ascii让中文原样输出,不加的话会显示成国际这种转义);其它转义后塞进pre。非 HTML 都做转义,防止内容里的尖括号被当标签解析。统一存成.html再open:直接 open 无后缀文件,macOS 可能用编辑器打开,加.html才稳定走浏览器。set -euo pipefail:出错即停,让脚本更健壮。六、使用案例参数和curl完全一致,把命令名换成curlv即可:# JSON 接口,自动美化缩进curlv https://api.github.com/repos/anthropics/anthropic-sdk-python# 普通网页,直接渲染curlv https://example.com# 先看安装脚本内容,再决定要不要执行(呼应第一节的初衷)curlv https://arch-qingzhou.oss-cn-beijing.aliyuncs.com/rd-cli/install.sh# 带 headercurlv-HAuthorization: Bearer tokenhttps://api.xxx.com/user# POST 表单curlv-XPOST-dnametomhttps://httpbin.org/post# basic auth / 带 cookiecurlv-uuser:pass https://xxx.com curlv--cookiesidabchttps://xxx.com七、注意事项别再自己传-o/--output:脚本靠-o把响应体存文件再渲染,你再传会覆盖它,导致浏览器展示为空。别再自己传-w:会覆盖脚本取 Content-Type 的逻辑,类型判断失效。除以上两个外,其余 curl 参数(-H-X-d-u--cookie等)均可照常追加。为什么单独写脚本、不写进 ~/.zshrc?逻辑放独立文件,~/.zshrc保持干净,存盘即生效无需反复source,而且任何 shell 或其它脚本都能调用;写进.zshrc的函数只在交互式终端里可用,还会让配置文件越堆越乱。八、卸载rm~/.local/bin/curlv删掉脚本即可。若第 5 步往~/.zshrc加过 PATH 那行,可留着(对其它工具也有用),想清理就手动编辑~/.zshrc删掉那一行。参考curl-w可用变量(含content_type):https://curl.se/docs/manpage.html#-wmacOSopen命令手册:https://ss64.com/mac/open.htmlPythonjson.tool模块:https://docs.python.org/3/library/json.html#module-json.tool