运行curl下载的SH文件报错,如何用bash+curl直接执行网络SH脚本?
报错原因
- 核心诱因是换行符格式不兼容:你从网络获取的脚本大概率是Windows环境编辑后上传的,使用
CRLF(\r\n)作为换行标识,而Linux Shell仅识别LF(\n)换行格式,会把行尾残留的\r识别为命令名称的一部分,自然会提示apt\r、gedit\r这类命令不存在。你复制脚本内容手动新建文件时,编辑器会自动将换行符转换为Linux兼容的LF格式,所以手动重建的脚本可以正常运行。 - 次要可能原因是脚本开头带有UTF-8 BOM头:部分编辑器导出UTF-8编码文件时会在文件开头添加3字节的BOM标识,Shell解析时会将这部分内容识别为无效字符,导致脚本执行异常。
实现方案
现有脚本修复
你当前的脚本首先要修复两个明显问题:
- 下载的脚本内容需要先做格式兼容处理,再写入本地文件
- else分支中
chmod命令后错误拼接了执行参数,需要将参数传递给后续的bash执行
修正后的核心逻辑如下:
if [ "$1" == "-u" ] || [ "$1" == "--url" ] then # 先移除BOM头和\r换行符再写入文件 curl -s --max-redirs 10 "$2" -L | sed '1s/^\xEF\xBB\xBF//' | tr -d '\r' > "$HOME/.br/cache/sh.sh" chmod +x "$HOME/.br/cache/sh.sh" # 用$@传递所有原始参数,代替手动写$1-$9 bash "$HOME/.br/cache/sh.sh" "${@:3}" else curl -s --max-redirs 10 "tiny.cc/brl_$1" -L | sed '1s/^\xEF\xBB\xBF//' | tr -d '\r' > "$HOME/.br/cache/sh.sh" chmod +x "$HOME/.br/cache/sh.sh" bash "$HOME/.br/cache/sh.sh" "${@:2}" fi
无需下载直接运行的实现
如果不需要缓存脚本到本地,可以直接用进程替换的方式执行,不需要落地写入文件:
# 直接执行远程脚本,不需要本地存储 bash <(curl -s --max-redirs 10 "$TARGET_URL" -L | sed '1s/^\xEF\xBB\xBF//' | tr -d '\r') "$ARGS"
处理后的内容直接传入bash进程,完全不需要本地存储步骤。
内容的提问来源于stack exchange,提问作者Felipecconde
相关产品推荐
相关产品推荐

