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
相关产品推荐
相关产品推荐

