如何编写Bash单行命令将Git非删除文件传入dip sniff fix并支持相对路径?
解决方案
最终单行命令
git diff --name-only --relative --diff-filter=d HEAD | xargs -d '\n' -r script -q /dev/null -c 'dip sniff fix "$@"' _
命令拆解
git diff --name-only --relative --diff-filter=d HEAD--name-only:仅输出变更文件的路径--relative:输出相对于当前子目录的路径,确保在项目任意子目录都能正确运行--diff-filter=d:过滤掉已删除(deleted)的文件,只保留修改、新增的文件HEAD:对比当前工作区与最新提交的差异,获取所有待处理的有效文件
xargs -d '\n' -r-d '\n':以换行符作为参数分隔符,完美处理带空格、特殊字符的文件名-r:当没有符合条件的文件时,不执行后续命令,避免dip无参数运行报错
script -q /dev/null -c 'dip sniff fix "$@"' _script -q /dev/null:静默模式下模拟TTY环境,彻底解决the input device is not a TTY错误-c 'dip sniff fix "$@"':执行dip修复命令,$@接收所有从xargs传递来的文件路径_:作为脚本的占位参数,保证$@能正确映射到传入的文件列表
备选方案(依赖expect工具)
如果系统没有script命令,可安装expect包后使用unbuffer:
git diff --name-only --relative --diff-filter=d HEAD | xargs -d '\n' -r unbuffer dip sniff fix
内容的提问来源于stack exchange,提问作者Zeth
相关产品推荐
相关产品推荐

