Node.js parseArgs 重复选项:传了两次 mode,为什么结果只保留最后一次 维护一个命令行工具时,用户可能同时传入 --mode=fast 和 --mode safe。解析没有报错,values.mode 却只剩 safe。要判断是否误写了两次,就不能仅检查最终 values;需要保留原始选... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python parse_known_args 参数转发:未知的 --for,为什么被当成 --format 吃掉 包装脚本只想读取自己的 --format,再把其他选项交给下游工具,于是使用 parse_known_args。调用者传入下游的 --for json,结果下游什么也没收到。原因是已知解析器默认允许长选项缩写,--f... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash printf 格式串:文本里的百分号为什么不能直接交给第一个参数 脚本读取了一段带百分号的文本,原样保存没有问题,交给 printf 却少了字符,甚至报格式错误。给变量加双引号仍然无效,是因为问题不在分词,而在参数的角色:printf 的格式参数会被解释,其中的百分号与反斜杠拥有特... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
Git pathspec 精确选文件:加了引号和双横线,路径仍可能被当成模式 仓库里同时有 report[1].txt 和 report1.txt,给文件名加上引号再交给 Git,结果仍可能选中后者。原因是命令经历了两层解释:shell 先处理参数,Git 再按 pathspec 规则选择路径... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Git clean 先看预览:未跟踪目录、忽略文件和大小写选项分别覆盖什么 忽略列表并不是可以丢弃的清单构建结束以后,工作目录里可能混着生成文件、个人草稿和本地配置。它们有些未被跟踪,有些被忽略,外观上却都只是普通文件。git clean 根据版本控制状态与选项决定候选范围,并不知道某个文件... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
Python shlex 拆分带引号文本:得到词元之后,还没有执行任何命令 一个小工具接受类似“动作加参数”的文本,名称里允许空格,也允许用引号表示空字符串。直接按空白 split 会把一个名称切成两段;自己反复替换引号,又容易破坏转义和错误提示。shlex 可以处理这种接近 Unix sh... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Python argparse 布尔开关:为什么传入 false,结果却仍然为真 先决定用户要传开关,还是传一个值一个报告脚本默认启用缓存,调用者希望临时关闭,于是输入缓存参数和单词 false,结果缓存仍然开启。问题往往不在缓存逻辑,而在命令行入口:布尔转换函数只判断字符串是否为空,并不理解这个... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
Bash getopts:选项解析、剩余位置参数和两种错误要分开 先写清命令行允许什么顺序准备一个处理文件的小工具:-v 开启详细输出,-n 指定处理次数,其余参数是文件名。实现前先确定调用约定:选项放前面,文件放后面;文件名可能包含空格,也可能以横线开头。这个约定直接决定哪些输入... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
Linux umask 权限计算:为什么文件是 640,目录却是 750 同一个终端里新建文本文件通常得到 644,新建目录却是 755,这并不矛盾。程序请求的初始权限不同,umask 再从中屏蔽指定权限位。把两者分开计算,才能解释为什么调整掩码后结果仍不符合预期。本文用 Linux 和 ... yunqueblog/ 技术教程/ 2026-10-01/ 5 阅读
jq 默认值处理:别把缺失、null 和 false 混为一谈 配置文件里 enabled=false 明明表示关闭,经过一段 jq 过滤后却变成 true,问题往往出在默认值语义。字段不存在、字段显式为 null,以及字段为 false,是三种不同输入。本文以 jq 1.7 手... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读