在Mac(bash 5.2.0)下如何用xargs执行文件中每行bash命令?
Mac批量执行长bash命令的解决方法
方案1:调整xargs写法规避长度限制
Mac自带的是BSD版本xargs,使用-I时存在255字符左右的长度限制,这就是长命令报错的根源。可以舍弃-I,改用直接传递参数的方式:
cat file_with_commands.txt | xargs -P10 -n1 bash -c '$0'
如果命令包含空格、引号等特殊字符,建议用null分隔避免解析错误:
tr '\n' '\0' < file_with_commands.txt | xargs -0 -P10 -n1 bash -c '$0'
方案2:使用parallel工具(推荐)
parallel对长命令和特殊字符的支持更友好,先通过Homebrew安装:
brew install parallel
然后直接批量执行命令,-j10控制并发数:
parallel -j10 < file_with_commands.txt
方案3:纯bash脚本手动控制并发
不想安装额外工具的话,用bash循环配合后台进程实现:
#!/usr/bin/env bash MAX_PROCS=10 running=0 while IFS= read -r cmd; do # 后台执行命令 bash -c "$cmd" & ((running++)) # 达到最大并发数时,等待任意一个进程结束 if (( running >= MAX_PROCS )); then wait -n (( running-- )) fi done < file_with_commands.txt # 等待剩余进程执行完毕 wait
将上述内容保存为run_cmds.sh,赋予执行权限后运行:
chmod +x run_cmds.sh ./run_cmds.sh
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

