如果我使用此链接安装 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
Run Code Online (Sandbox Code Playgroud)
这是因为实际文件是docker-compose-linux-x86_64小l, 而:
[root@hostname ~]# echo $(uname -s)-$(uname -m)
Linux-x86_64
Run Code Online (Sandbox Code Playgroud)
它返还资本L。
我看到man curl但没有看到任何用于检查不区分大小写链接的条目。
use*_*686 35
并不是curl决定了\xe2\x80\x93链接的大小写不敏感,“检查”是服务器的决定。
\n(换句话说,HTTP 客户端没有机会查看所有可能的 URL 列表并选择一个匹配的 URL。HTTP客户端唯一能做的就是向服务器提供准确的 URL,并让服务器决定如何响应.有些服务器不区分大小写,有些则不区分。)
\n但是如果你已经知道你需要一个小写的“linux”,你可以在将输出提供给curl之前转换输出uname,例如通过管道将所有大写字母更改为小写:tr A-Z a-z
docker-$(uname -s | tr A-Z a-z)\nRun Code Online (Sandbox Code Playgroud)\n或者使用 Bash 的${var,,}扩展来返回 的小写版本$var:
os=$(uname -s); arch=$(uname -m)\n\ndocker-${os,,}-${arch}\nRun Code Online (Sandbox Code Playgroud)\n最后,由于只有一小部分接受的值,并且由于接受的值通常不能保证是“unname but lowercase”,因此您可以间接分配每个可能的值(使用if或case块),例如:
case $(uname -s) in\n Darwin) docker_os='darwin';;\n Linux) docker_os='linux';;\n Cygwin) docker_os='windows';;\n Microsoft) docker_os='windows';;\n *) echo "Docker is not supported on this OS!" >&2; exit 1;;\nesac\nRun Code Online (Sandbox Code Playgroud)\n(注:“windows”示例完全是虚构的。)
\nKam*_*ski 17
\n要完全模拟服务器的不区分大小写,curl必须尝试所有可能的组合(\xe2\x80\xa6LiNUx\xe2\x80\xa6, \xe2\x80\xa6linUX\xe2\x80\xa6),并且它们的数量非常多。
如果您知道服务器使用全小写字符串,那么合理的做法是在提供给curl. 重击示例:
url="https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)"\nurl="${url,,}"\ncurl -L "$url" -o here\nRun Code Online (Sandbox Code Playgroud)\n但正确的 URL 是 with v2.9.0,并且有问题的服务器实际上对该组件不区分大小写docker-compose-\xe2\x80\xa6。对您来说最简单的修复就是添加缺少的v:
curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o here\n# this was missing ^\nRun Code Online (Sandbox Code Playgroud)\n没有这个,v任何转换都无济于事。
正如其他人已经指出的那样,不区分大小写是在服务器端配置的,您无法从计算机上更改它。
\n但是,您可以使用其他一些工具将字符串转换为小写:
\n\xe2\x95\xad\xe2\x94\x80user@machine ~ \xe2\x80\xb9main\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $(uname -s)-$(uname -m) | tr '[:upper:]' '[:lower:]' \nlinux-x86_64\nRun Code Online (Sandbox Code Playgroud)\n