MacOS下Bash的source命令结合curl使用时出现命令未找到错误
解决
source <(curl ...)时read_os_name: command not found的问题 嘿,我一眼就看到你脚本里的一个关键问题,咱们先从这个最可能的原因入手:
1. 修复脚本的shebang行语法错误
你的read_os_name.sh第一行把shebang和变量声明写在同一行里了:
#!/bin/bash declare -r UTILS_URL="https://raw.githubusercontent.com/nicholasadamou/bash-utils/master/utils.sh"
这是完全错误的!shebang(#!/bin/bash)必须单独占一行,后面的命令要另起一行。Bash会把整个行当作解释器的参数,导致UTILS_URL变量根本没被定义,curl请求的是空URL,自然source不到任何内容,也就找不到read_os_name函数了。
把脚本改成这样就对了:
#!/bin/bash declare -r UTILS_URL="https://raw.githubusercontent.com/nicholasadamou/bash-utils/master/utils.sh" source <(curl -s "$UTILS_URL") read_os_name #Should output "macos"
2. 其他可能的排查方向
如果改完shebang还是有问题,咱们再检查这几个点:
验证curl是否能正确获取内容:在终端直接运行这个命令,看看输出里有没有
read_os_name函数:curl -s "https://raw.githubusercontent.com/nicholasadamou/bash-utils/master/utils.sh"如果输出是空的或者不完整,说明网络有问题,或者远程文件路径不对。
处理换行符问题:有时候远程文件的换行符是Windows格式(
\r\n),老版本的Bash(比如Mac 10.13默认的Bash 3.2)解析会出问题,可以试试把换行符转成Unix格式:source <(curl -s "$UTILS_URL" | tr -d '\r')改用临时文件加载(兼容老Bash):Mac默认的Bash 3.2对进程替换
<(...)的支持可能有小问题,你可以先把文件下载到临时文件再source:#!/bin/bash declare -r UTILS_URL="https://raw.githubusercontent.com/nicholasadamou/bash-utils/master/utils.sh" temp_utils=$(mktemp) curl -s "$UTILS_URL" > "$temp_utils" source "$temp_utils" rm "$temp_utils" read_os_name
按照这个步骤来,应该就能解决你的问题了!
内容的提问来源于stack exchange,提问作者Nicholas Adamou
相关产品推荐
相关产品推荐

