You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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解析时会将这部分内容识别为无效字符,导致脚本执行异常。

实现方案

现有脚本修复

你当前的脚本首先要修复两个明显问题:

  1. 下载的脚本内容需要先做格式兼容处理,再写入本地文件
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:06:03