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

bash脚本如何仅在URL文件存在时source内容且隐藏所有输出

问题解决方法

你遇到的问题核心是进程替换<(curl ...)的执行逻辑不会把curl的退出码传递给source命令:就算curl执行失败返回非0,进程替换依然会生成一个空的可读文件描述符,source空内容默认返回0,所以if条件会误判为成功。

可行实现代码

#!/bin/bash
# 捕获远程文件内容,同时吞掉curl所有输出
remote_content=$(curl -s -f "http://example.com/$1.txt" 2>/dev/null)

# 先判断curl请求是否成功
if [ $? -eq 0 ]; then
    # 请求成功才执行source,同时吞掉脚本执行的所有输出
    source <(printf '%s\n' "$remote_content") >/dev/null 2>&1
    echo "Found the file"
else
    echo "Couldn't find it"
fi

方案说明

  • 保留curl -f参数保证请求失败(如404、500等)时curl返回非0退出码,-s关闭curl进度输出,2>/dev/null吞掉所有curl错误提示
  • 优先判断curl的退出状态,只有请求正常返回时才执行source操作,完全避免了source空内容的误判问题
  • source阶段额外添加>/dev/null 2>&1,把远程脚本执行产生的所有标准输出、错误输出全部隐藏,符合你的静默要求
  • 用printf传递内容比echo更稳妥,可避免远程脚本内容含特殊字符时的解析异常

大文件备选方案

如果远程脚本体积较大,用变量存储内容会占用过多内存,可改用临时文件方案:

#!/bin/bash
# 创建临时文件存储远程内容
temp_script=$(mktemp)
# 请求结果写入临时文件,吞掉所有curl输出
curl -s -f "http://example.com/$1.txt" 2>/dev/null > "$temp_script"

if [ $? -eq 0 ]; then
    # 执行临时文件内容,吞掉所有输出
    source "$temp_script" >/dev/null 2>&1
    echo "Found the file"
else
    echo "Couldn't find it"
fi
# 清理临时文件
rm -f "$temp_script"

内容的提问来源于stack exchange,提问作者Marry Jane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:36:03