ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

curl --config 完全指南:配置文件语法、转义规则与 .curlrc 默认加载机制

curl --config 完全指南:配置文件语法、转义规则与 .curlrc 默认加载机制 curl --config 完全指南配置文件语法、转义规则与 .curlrc 默认加载机制【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本文基于 curl 官方命令行选项文档 docs/cmdline-opts/config.md结合src/下命令行工具实现源码系统讲解curl --config file短选项-K的使用方法配置文件的书写语法、注释与转义规则、URL 的指定方式、--config -从标准输入读取以及 curl 每次启动时如何自动查找并加载默认配置文件.curlrc。读完本文你将能编写可复用的 curl 参数配置文件理解选项加载顺序与查找路径的完整机制并能在日常脚本与自动化中安全地用好-K、-q两个开关。一、--config是什么把参数写进文件像命令行一样执行--config file的作用是从指定的文本文件中读取 curl 参数文件中找到的每一行参数都会被当作在命令行上直接输入一样生效。它适合把一长串重复使用、难以记忆的参数沉淀为一份配置文件随取随用。选项元数据速览见 docs/cmdline-opts/config.md属性值长选项--config短选项-K参数file指定配置文件名帮助文本Read config from a fileMultiappend可在同一次调用中多次使用--config相关选项--disable见 docs/cmdline-opts/disable.md其典型用法为--config file.txt $URL即在命令行上显式指定一份配置文件文件内容随后面的真实 URL 一起构成完整请求。在命令行工具源码中--config的解析入口位于 src/tool_getparam.c命中C_CONFIG后先递减递归计数再调用 src/tool_parsecfg.c 中的parseconfig()逐行读取并执行该文件。注意--config是追加append型选项可以多次出现文件会按出现顺序被依次处理。二、配置文件语法一行一个选项1. 选项与参数必须写在同一行配置文件中每个选项及其参数必须位于同一物理行不能像自然语言那样换行书写。选项与参数之间用以下三者之一分隔空白空格 / 制表符冒号:等号# 三种分隔方式等价 user-agent superagent/1.0 user-agent: superagent/1.0 user-agent superagent/1.02. 长选项名可以省略开头的双破折号配置文件中的长选项名允许省略开头的--。此时因为选项行不以-开头冒号或等号就可以作为选项名与参数之间的分隔符使用。反过来如果选项带了前缀一个-或两个--那么选项与参数之间就不能再出现冒号或等号必须用空白分隔。源码中用宏ISSEP精确地体现了这一约束src/tool_parsecfg.c只有dash选项以-开头为假时:与才被当作合法分隔符。# 正确省略了 -- 的长选项可以用 分隔 user-agent superagent/1.0 # 错误带了 -- 前缀后不能再使用 --user-agent superagent/1.03. 参数含空白、或以:/开头时必须加双引号如果参数中包含空白字符或参数本身以冒号:或等号开头则该参数必须用双引号整体包裹header X-Custom-Header: hello world # 参数含空白必须引号 data rawvalue # 参数以 开头必须引号双引号内部支持以下转义序列转义写法含义\\反斜杠字面量\\双引号字面量\t制表符\n换行符\r回车符\v垂直制表符除上述之外的任何字符前面加反斜杠反斜杠本身会被忽略即\x等价于x。这一逻辑在 src/tool_parsecfg.c 的unslashquote()中逐字符实现\t、\n、\r、\v被替换为对应控制字符其余\后字符原样输出。值得一提的是源码会尽力帮助用户排错未加引号的参数若以单引号开头会输出警告提示可能是个错误建议使用双引号未加引号的参数如果后面还跟着多余内容例如header X: Y中未加引号的空白会警告uses argument with unquoted whitespace. This may cause side-effects. Consider double quotes.这两条诊断都来自 src/tool_parsecfg.c 的extract_param()。4. 注释如果一行的第一个非空白字符是#那么整行被视为注释而被跳过。解析循环my_get_line()会先跳过前导空白再判断首字符是否为#或行是否为空从而自动滤掉注释行与空行见 src/tool_parsecfg.c。# 整行注释前面可以有缩进 # 前导空白不影响注释判断 url example.com # 这是错误用法行尾注释并不会被如此处理5. 每行只能写一个选项单行上限 10 MB配置文件要求每个物理行只写一个选项不能在一行里堆叠多个参数。单个行的长度上限为10 MB该限制自 curl 8.2.0 起生效。源码侧MAX_CONFIG_LINE_LENGTH定义为10 * 1024 * 1024src/tool_cfgable.hparseconfig()用它初始化读取缓冲超长或内存不足的行会触发读错误src/tool_parsecfg.c。6. 从标准输入读取--config -把文件名指定为单个连字符-curl 就从**标准输入stdin**读取配置内容。这样可以把参数动态管道进来例如由其他程序生成配置后直接喂给 curl。源码 src/tool_parsecfg.c 中当文件名为-时直接使用stdin作为输入流。注意此时配置文件与后续需要交互的请求体不要共用 stdin以免互相干扰。三、在配置文件中如何指定 URL一个容易踩的坑是配置文件里不能把 URL 单独写在一行必须通过--url选项来指定。即命令行上裸 URL的写法curl example.com在配置文件里不存在对应语法必须写成url https://example.com/docs/这种写法本质上就是省略了--前缀的--url选项行。四、一份完整的配置文件示例下面的示例完整展示了注释、URL、输出文件、自定义 UA、下载标记与 Referer 的组合写法# --- Example file --- # this is a comment url example.com output curlhere.html user-agent superagent/1.0 # and fetch another URL too url example.com/docs/manpage.html -O referer http://nowhereatall.example.com/ # --- End of example file ---要点解读两个url 行会像命令行给出两个 URL 一样触发两次独立传输output curlhere.html相当于--output curlhere.html把响应写入文件-O以带短横线的短选项形式出现此时不涉及冒号/等号分隔符合带前缀选项必须用空白与参数隔开此处无参数的规则注释可以穿插在选项之间便于维护。假设该文件保存为download.conf调用方式为curl --config download.conf五、源码级解析流程从文本行到参数生效理解--config的真实执行路径有助于解释前面所有语法规则。parseconfig()src/tool_parsecfg.c的大致流程为open_config_file()打开指定文件或解析默认.curlrcmy_get_line()逐行读取自动丢弃空行与#注释行对每一行先截出选项关键字判断其是否以-开头dashed_optionextract_param()根据是否带前缀来决定:、能否作为分隔符并完成双引号与转义解析调用与命令行完全相同的getparameter()把选项应用到OperationConfigprocess_config_result()处理结果并报告错误错误信息会带上文件名:行号上下文便于定位例如config file option xxx ...。值得注意的两个工程细节配置嵌套与递归深度配置文件中可以再写一行--config other.txt实现嵌套引用但解析深度受限。CONFIG_MAX_LEVELS定义为 5src/tool_parsecfg.h超限时报错Max config file recursion level reached (5)src/tool_getparam.c。选项别名等价配置行里出现的选项名和命令行完全等价含布尔开关的--no-前缀等因为最终都汇入同一个getparameter()分发逻辑。六、默认配置文件.curlrc每次启动自动加载当 curl 启动时除非使用了--disable它会自动探测一份默认配置文件并加载它——即使你同时显式使用了--config默认文件依然会被加载二者叠加生效。默认配置文件按以下顺序在如下位置查找即 docs/cmdline-opts/config.md 所列官方顺序$CURL_HOME/.curlrc$XDG_CONFIG_HOME/curlrc此路径自 curl 7.73.0 起支持$HOME/.curlrcWindows%USERPROFILE%\.curlrcWindows%APPDATA%\.curlrcWindows%USERPROFILE%\Application Data\.curlrc非 Windows 平台使用getpwuid解析出的用户主目录Windows若以上位置均未找到.curlrc还会在curl 可执行文件所在目录里查找一份其中 1–3 是按优先级从高到低尝试找到第一份就停止。源码中的查找顺序定义在 src/tool_findfile.c 的conf_list[]数组中并在 src/tool_findfile.c 的findfile()中依次迭代环境变量、逐目录探测最后以getpwuid/geteuid作为非 Windows 平台的兜底。同时该实现还包含一处文档之外的回退当XDG_CONFIG_HOME未设置时会额外检查$CURL_HOME/.config/curlrc与$HOME/.config/curlrc。与默认配置相关的几个环境变量可汇总为环境变量作用CURL_HOME优先级最高指向存放.curlrc的目录XDG_CONFIG_HOME指向存放curlrc无点前缀的配置目录7.73.0 起支持HOMEUnix/Linux 下的主目录回退项USERPROFILE/APPDATAWindows 平台下的回退项七、Windows 上的文件命名差异Windows 平台比较特殊每个候选位置会依次检查两个文件名——.curlrc与_curlrc下划线版并且优先采用带点的.curlrc。这与源码中dotscore参数同时尝试.与_两种前缀的实现一致src/tool_findfile.c。较早版本的 curl 在 Windows 上只认_curlrc新版本出于兼容考虑两者都接受。若所有上述位置都找不到Windows 版还会在 curl 可执行文件所在目录中再找一次。八、--disable-q与默认配置的加载时机默认配置文件.curlrc的存在意味着用户环境可能静默改变curl 行为。若不想加载它可使用--disable短选项-qcurl -q https://example.com/ curl --disable https://example.com/根据 docs/cmdline-opts/disable.md-q/--disable只有作为命令行的第一个参数时才真正生效在它之后出现时默认配置多半已被读取。其加载时机在源码中有清晰体现src/tool_operate.coperate()首先根据第一个参数判断是否调用parseconfig(NULL, ...)加载默认.curlrc随后才进入parse_args()解析真正的命令行参数。由此可以确认一个重要的执行顺序语义默认配置文件先于命令行参数被处理因此命令行上给出的选项会覆盖.curlrc中的同名设置。这也意味着在--config file.txt之后继续追加的参数可以再次覆盖配置文件中的值——顺序在后、覆盖在先。另外还有一个隐藏行为当 curl 以没有任何参数的方式启动时它同样会尝试读取.curlrc若默认配置中没有给出 URLcurl 会直接打印帮助信息并以失败状态退出CURLE_FAILED_INIT。因此若希望裸运行 curl 即可按.curlrc发起请求务必在默认配置里用url ...指定目标地址。九、实践建议与常见误区小结长选项去前缀书写最顺手配置文件里写user-agent ...、output file.html比到处加--更简洁而带-/--前缀的写法必须用空白分隔参数。带空白的参数务必加双引号并用\t、\n等转义表达控制字符避免被拆成多个字段。URL 永远走url 行裸 URL 在配置文件中不合法。注释用行首#不要把注释跟在参数之后以免触发未加引号的空白告警甚至解析歧义。警惕环境中的.curlrc如果命令行为与你预期不符先检查$CURL_HOME、$XDG_CONFIG_HOME、$HOME下是否存在.curlrc必要时用首个参数-q彻底跳过。利用嵌套与追加能力--config可多次使用、可嵌套深度上限 5 层、可与命令行参数混排适合按场景拆分配置片段。相关参考选项定义与解析--config帮助条目见 src/tool_listhelp.c长/短选项表见 src/tool_getparam.c配置文件解析实现src/tool_parsecfg.c、src/tool_parsecfg.h默认文件路径查找实现src/tool_findfile.c默认配置加载时机src/tool_operate.c官方文档docs/cmdline-opts/config.md、docs/cmdline-opts/disable.md【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表