使用cURL下载文件赋值变量时遇空字节忽略警告问题
解决cURL下载文件到变量时的空字节警告问题
我尝试用cURL下载文件并赋值给变量,执行的命令是:
var=$(curl -s <urlToFile>)
执行后收到警告:
warning: command substitution: ignored null byte in input
我花了很长时间找解决方案都没成功。
补充需求
- 需要在后台线程中同时下载多个小文件并赋值给变量
- 之后要把这些线程中的内容按指定顺序保存到同一个文件里
- 文件必须同时下载,最终合并的顺序不能乱
解决方案:Base64编码处理
Bash变量无法存储空字节,而部分小文件(尤其是二进制类型)可能包含空字节,这就是警告出现的核心原因。通过Base64编码把二进制内容转成纯文本格式,就能安全存入变量,后续再解码还原即可。
单文件处理示例
下载并编码:
var=$(curl -s <urlToFile> | base64)
解码并写入文件:
echo "$var" | base64 -d >> output.txt
多线程按顺序合并示例
用临时文件存储每个线程的编码结果,等所有下载完成后再按原顺序解码合并,既保证同时下载,又不打乱最终的内容顺序:
# 按最终需要的顺序定义URL列表 urls=("https://example.com/file1" "https://example.com/file2" "https://example.com/file3") # 初始化临时文件列表 temp_files=() for idx in "${!urls[@]}"; do temp_file="/tmp/download_${idx}.tmp" temp_files+=("$temp_file") # 后台执行下载+编码,结果写入临时文件 curl -s "${urls[$idx]}" | base64 > "$temp_file" & done # 等待所有后台下载任务完成 wait # 按顺序解码合并到目标文件 > output.txt # 先清空目标文件 for temp_file in "${temp_files[@]}"; do base64 -d "$temp_file" >> output.txt rm "$temp_file" # 清理临时文件 done
Base64方案很棒。感谢Stefan Hegny!
内容的提问来源于stack exchange,提问作者user2141238
相关产品推荐
相关产品推荐

