Bash中如何将seq数字序列输入GNU Parallel实现curl并行请求
问题原因
你遇到的错误核心是重定向语法使用错误:< 输入重定向符要求右侧必须是文件路径,而$(seq 1 100)展开后是1 2 3 ... 100的数字序列,不是合法文件路径,shell无法识别多字符串的重定向目标,因此抛出ambiguous类错误。你之前尝试的反引号写法和$()是等价的,本质问题没有解决。
可行的修改方案
- 方案1:用管道传递输入(最常用,无参数长度限制)
直接把seq的输出通过管道传给parallel作为输入,不需要重定向,对应执行行修改为:
seq 1 100 | parallel -j10 brx
- 方案2:使用进程替换实现重定向
如果你需要保留重定向的写法,用bash的进程替换语法<(命令),它会把命令输出模拟成临时文件供重定向读取,注意两个<之间必须有空格,对应执行行修改为:
parallel -j10 brx < <(seq 1 100)
- 方案3:用parallel内置的参数输入语法
parallel支持通过:::标记直接接收输入参数,适合序列较短的场景,对应执行行修改为:
parallel -j10 brx ::: $(seq 1 100)
注意:如果序列长度极大(超过shell命令行参数长度上限),该方案会报错,优先选择方案1
修改后的完整示例(采用方案1)
#!/bin/bash brx() { num="$1" curl -s "https://www.example.com/$num" } export -f brx while true; do seq 1 100 | parallel -j10 brx done
内容的提问来源于stack exchange,提问作者kenjoe41
相关产品推荐
相关产品推荐

