BASH如何随机打乱命令列表并按随机顺序执行,解决语法报错问题
错误原因排查
- 语法错误触发原因:
<()是bash/zsh支持的进程替换语法,不属于POSIX sh标准。如果你用sh cmd.sh运行脚本,就会触发<相关的语法错误。另外你原脚本中把命令拆分数组后用${array[@]}执行的写法无法正确处理管道、重定向等shell元字符,会导致命令执行异常。 - 额外兼容问题:MacOS默认没有预装GNU的
shuf命令,就算语法修复完成也会提示命令不存在。
可用实现方案
方案1:使用zsh运行(你的环境已预装zsh 5.8,推荐)
- 先安装coreutils获取打乱命令(已有可跳过):
brew install coreutils - 修改
cmd.sh内容如下:
while read -r line do # 执行整行命令,支持管道、重定向等语法 eval "$line" done < <(gshuf commands.txt)
- 用zsh执行脚本即可:
zsh cmd.sh
方案2:兼容bash 3.2,无额外依赖
不需要安装工具,用Mac原生命令实现随机排序,同时避免进程替换语法,兼容POSIX规范:
# 用awk+sort原生实现行随机打乱,逐行执行 awk 'BEGIN{srand()}{print rand() "\t" $0}' commands.txt | sort -n | cut -f2- | while read -r line do eval "$line" done
直接用bash cmd.sh运行即可,不会触发语法错误。
注意事项
你示例中cat file1.txt | sort > file1.txt的写法会直接清空file1.txt,因为shell会在命令执行前先打开重定向的文件,正确的原地排序写法为sort file1.txt -o file1.txt。
内容的提问来源于stack exchange,提问作者Christopher Penn
相关产品推荐
相关产品推荐

