如果我使用此链接安装 docker-compose,我会收到未找到错误:
[root@hostname ~]# curl -L "https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o here
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 9 100 9 0 0 37 0 --:--:-- --:--:-- --:--:-- 37
[root@hostname ~]# cat here
Not Found
这是因为实际文件docker-compose-linux-x86_64
较小l
,而:
[root@hostname ~]# echo $(uname -s)-$(uname -m)
Linux-x86_64
它返回资本L
。
我看见了man curl
但没有看到任何检查不区分大小写的链接的条目。
答案1
大小写不敏感并不是 curl 决定的,而是链接“检查”服务器的决定。
(换句话说,HTTP 客户端没有机会查看所有可能的 URL 列表并选择匹配的 URL。仅有的HTTP 客户端可以做的一件事就是向服务器提供准确的 URL,并让服务器决定如何响应。有些服务器不区分大小写,有些则不区分大小写。
但如果你已经知道需要小写的“linux”,那么你可以直接转换uname
输出前将其交给 curl,例如通过管道tr A-Z a-z
将所有大写字母更改为小写:
docker-$(uname -s | tr A-Z a-z)
或者使用 Bash 的${var,,}
扩展来返回的小写版本$var
:
os=$(uname -s); arch=$(uname -m)
docker-${os,,}-${arch}
最后,由于只有一小部分可接受的值,并且由于通常不能保证可接受的值是“uname 但小写”,因此您可以间接分配每个可能的值(使用if
或case
块),例如:
case $(uname -s) in
Darwin) docker_os='darwin';;
Linux) docker_os='linux';;
Cygwin) docker_os='windows';;
Microsoft) docker_os='windows';;
*) echo "Docker is not supported on this OS!" >&2; exit 1;;
esac
(注:‘windows’示例完全是虚构的。)
答案2
为了完全模拟服务器的不区分大小写,curl
必须尝试所有可能的组合(…LiNUx…
,…linUX…
),而这样的组合数量是巨大的。
如果你知道服务器使用全小写字符串,那么一个合理的做法是在提供给之前将 URL 转换为小写curl
。Bash 示例:
url="https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)"
url="${url,,}"
curl -L "$url" -o here
但正确的 URL 是v2.9.0
,并且有问题的服务器实际上是不区分大小写对于docker-compose-…
组件。最简单的修复方法是添加缺失的v
:
curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o here
# this was missing ^
如果没有这个,v
任何转换都无济于事。
答案3
正如其他人指出的那样,不区分大小写是在服务器端配置的,您无法从您的机器上更改它。
但是,您可以使用其他工具将字符串转换为小写:
╭─user@machine ~ ‹main›
╰─$ echo $(uname -s)-$(uname -m) | tr '[:upper:]' '[:lower:]'
linux-x86_64