资讯详情

资讯详情

fd -x 的 {} 占位符被 shell 提前解释导致命令出错怎么办?

fd -x 的 {} 占位符被 shell 提前解释导致命令出错怎么办【免费下载链接】fdA simple, fast and user-friendly alternative to find项目地址: https://gitcode.com/GitHub_Trending/fd/fd用fd的-x/-X给每个搜索结果执行外部命令时命令是一个“模板”其中的占位符{}会在 fd 执行命令前被替换成搜索到的路径。但当命令里显式写{}或{.}、{/}等时有些 shell 会在把参数交给 fd 之前就把它解释掉fd 收到的模板里已经没有占位符于是外部命令拿到的是空参数转换、删除、统计等后续操作就会出错。本文基于 README.md 的 Command execution 与 Troubleshooting 章节以及 fd.1 手册给出定位与修复方法给占位符加引号。占位符本应由 fd 替换而不是 shell-x/-X把命令模板接收为一组参数。fd 在执行前会把模板中的占位符替换为当前搜索结果对应的值README.md “Placeholder syntax”一节{}搜索结果的完整路径如documents/images/party.jpg{.}同{}但去掉文件扩展名documents/images/party{/}结果的文件名basename如party.jpg{//}结果所在的父目录documents/images{/.}去掉扩展名的文件名partyREADME 给出的转换示例fd -e jpg -x convert {} {.}.png这里{}会被替换成每个匹配到的 jpg 文件路径{.}是去掉扩展名后的路径最终等效于对每个文件执行convert party.jpg party.png这类命令。如果模板中不包含任何占位符fd 会自动在末尾补一个{}——所以fd -e zip -x unzip这种不写{}的写法不受 shell 解析影响。问题只出现在你显式写出占位符、而 shell 抢先处理了它的时候。如何判断占位符被 shell 提前解释了出现这类问题时先确认故障发生在哪一层命令模板里是否显式写了{}或其他花括号占位符且未加引号外部命令收到的参数是否为空串或 shell 解释后的内容而不是文件路径——表现就是命令对“空参数”报错、或在错误的位置生成文件。README.md Troubleshooting 中的 “Placeholders in-x/-X” 一节给出的结论是Depending on your shell, you may need to quote the placeholders ({},{/},{//},{.},{/.}) to prevent the shell from interpreting them beforefdsees them.也就是说是否需要加引号取决于你的 shell但加引号是文档给出的通用解法加引号在任何 shell 下都是安全的。修复用单引号把占位符交给 fd把含占位符的参数用单引号包起来shell 就会把{}原样传给 fd替换由 fd 完成fd -e jpg -x convert {} {.}.png执行后的验证fd 对每个搜索结果实际执行的命令里应该出现真实路径例如对party.jpg执行convert party.jpg party.png而不是空参数。可以结合文档建议的方式做只读确认先用echo代替有副作用的命令打印 fd 实际拼出的参数fd -e jpg -x echo {} {.}.png如果输出中每行都是具体的文件路径而不是空串说明占位符已成功交给 fd 替换确认无误后再换回convert这类真正产生副作用的命令。需要字面量花括号时而不是占位符fd 提供转义写法{{和}}见 doc/fd.1 的--format占位符说明不要靠去掉引号来实现。相关但独立的两个 shell 解析坑同样属于“shell 在 fd 之前解释”的问题README Troubleshooting 一并给出了处理方式命令模板中如需在-x之后再传 fd 参数要用\;作为模板终止符——Most shells require ; to be escaped: \;见 doc/fd.1 的-x, --exec条目。更清晰的替代写法是把-x放到整条命令最后例如fd pattern path -x echo这样所有前位置参数都属于 fd。如果搜索模式以连字符开头它会被当作命令行选项需要加--或改用字符类例如fd -- -pattern或fd [-]pattern。完整可用的写法示例以下命令均来自 README 文档按文中方式可直接执行pattern替换为你的搜索模式# 模板不带占位符fd 自动在末尾补 {} fd -e zip -x unzip # 显式占位符全部加单引号 fd -e jpg -x convert {} {.}.png # -x 放最后避免后面的参数被误认为命令模板的一部分 fd pattern path -x echo # 批量模式-X 只启动一次命令所有结果作为参数 fd -g test_*.py -X vim记住一条判断标准只要参数里出现了{}系列占位符就用单引号把它和后面的 fd 参数区分开不写占位符时fd 会自己补{}无需担心 shell 解析。【免费下载链接】fdA simple, fast and user-friendly alternative to find项目地址: https://gitcode.com/GitHub_Trending/fd/fd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →