如何解决MacOS X中xargs不支持-d选项的问题?
解决Mac OSX下xargs不支持-d选项的问题
你遇到的核心问题是:Mac自带的BSD版本xargs不具备Linux系统中GNU xargs特有的-d(指定分隔符)选项,这是两大Unix工具集的典型差异点。下面提供几种实用的解决方案:
方法1:安装GNU xargs(推荐,和Linux用法完全兼容)
Mac上可以通过Homebrew安装包含GNU xargs的findutils包:
brew install findutils
安装完成后,GNU xargs会被命名为gxargs,直接替换原命令中的xargs即可:
gxargs -d '\n' -n 8 bash -c 'phpcs_element PSR2 "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8"' -- >&2 2>/dev/null
如果希望让xargs默认指向GNU版本,可以在你的shell配置文件(如~/.bashrc或~/.zshrc)中添加别名:
alias xargs='gxargs'
执行source ~/.bashrc(对应你的shell配置文件)或重启终端,别名就会生效。
方法2:用BSD xargs结合awk实现按换行分割
BSD xargs支持-0选项(以null字符作为分隔符),我们可以借助awk将每行内容用null字符包裹,以此模拟-d '\n'的效果:
awk '{printf "%s\0", $0}' | xargs -0 -n 8 bash -c 'phpcs_element PSR2 "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8"' -- >&2 2>/dev/null
原理说明:
awk把每行输出用null字符(\0)结尾,null字符是唯一不会出现在文件名中的字符,能避免空格、特殊字符导致的参数拆分错误xargs -0识别null字符作为分隔符,完美替代GNU xargs的-d '\n'功能
方法3:用shell循环批量处理(无需额外工具)
如果不想安装第三方工具,也可以用原生shell的while循环实现批量读取:
while true; do # 一次性读取8行内容,存入变量 read -r line1 || break read -r line2 || true read -r line3 || true read -r line4 || true read -r line5 || true read -r line6 || true read -r line7 || true read -r line8 || true # 执行命令,仅传递非空的行参数 phpcs_element PSR2 "$line1" "$line2" "$line3" "$line4" "$line5" "$line6" "$line7" "$line8" >&2 2>/dev/null # 若首次读取就为空,退出循环 [ -z "$line1" ] && break done < <(your_input_command)
注意将your_input_command替换为你原本用来生成待处理文件列表的命令(比如find . -name "*.php")。这个方案无需依赖任何外部工具,但代码相对冗长。
内容的提问来源于stack exchange,提问作者Stefan DOK
相关产品推荐
相关产品推荐

