cURL 是所有类 Unix 操作系统的标准部分吗?

cURL 是所有类 Unix 操作系统的标准部分吗?

我正在编写一个需要从互联网下载一些数据的 shell 脚本,我只是在想我是否可以依赖cURL它预装在所有 Unix 发行版上。
我知道wget默认情况下 OS X 上没有预装,但cURL确实有。我还记得我在 Ubuntu Server 上安装过cURL,但已经一两年了。我今天尝试了 Ubuntu Server 12.04,它是cURL开箱即用的。

答案1

如果其他所有条件都相同,我想说您更有可能安装了 wget。

但是,为什么不简单地设置一个条件,在 PATH 中查找 wget 和 curl,并使用任何可用的选项(如果有的话)呢?如果您想要更进一步,也可以随意将 lynx、w3m 等混用。

答案2

不,cURL 不是操作系统的标准组成部分。它并非所有基于 Linux 的发行版的标准。

答案3

curl 和 wget 都不能“保证”安装在任何地方,尤其是在适当的 UNIX 系统上。它们不是 POSIX 标准。ftp、ssh / scp / sftp、rsync、telnet、nc / netcat、openssl 或任何能想到的相关工具也都不是。在我看来,这似乎是一个奇怪的疏忽,但事实就是如此。

各种 GNU/Linux 发行版可能包含 curl 和/或 wget,但 YMMV。

FreeBSD 标准配备“拿来“ 针对此类情况的工具,OpenBSD 配备了增强版 ”FTP“客户端可以利用其“自动获取”功能完成这项工作。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/

据我所知,POSIX 根本没有定义“tcp”文件传输工具。 统一通信协议是标准的,但我不知道如果不在两端进行配置更改,是否可以使其工作。

您可以对它们两者进行测试(正如许多人建议的那样),但要确定您要么需要安装某些东西,要么编写一些东西。

具有 tcp 套接字支持的 shell(如 ksh93 或 Bash)应该允许您在紧急情况下编写函数调用。当然,您仍然需要适当的权限才能读取/写入套接字。

GNU awk (“gawk”) 可以做到这一点,但是我认为只有 gawk 而没有像 curl 或 wget 那样更方便的工具的可能性很小。非常确定POSIX awk不支持网络,我不记得在“AWK 编程语言“但已经有一段时间了。当然,Perl、Python、Ruby、C 等也可以做到这一点。

看: https://www.shell-tips.com/bash/download-files-from-shell/

https://unix.stackexchange.com/questions/83926/how-to-download-a-file-using-just-bash-and-nothing-else-no-curl-wget-perl-et

https://unix.stackexchange.com/questions/336876/simple-shell-script-to-send-socket-message

笔记:自 2022 年起,古腾堡计划似乎不再支持通过端口 80 进行不安全的下载,因此下面的脚本示例已使用 HTTP 镜像进行了更新。

#!/bin/ksh

## Tested with ksh93u+ and Bash v3.2x
## Not tested with Binary files
## HTTP/1.1 will cause output to hang

#xHOST=gutenberg.org
#xDOC=/files/84/old/84.txt

gpHOST=mirrors.xmission.com
gpDOC=/gutenberg/8/84/old/84.txt
gpPORT=80

exec 3<>/dev/tcp/${gpHOST}/${gpPORT}
printf "GET ${gpDOC} HTTP/1.0\r\nHost: ${gpHOST}\r\n\r\n" >&3

# drop the header from the data stream
while IFS= read -r line ; do
   [ "$line" == $'\r' ] && break
done <&3

cat <&3 | tee Frankenstein.txt

专业提示:“tar”也不是 POSIX!使用“帕克斯“ 反而。

答案4

我想在这里更新一下,因为这些答案已经有近 10 年了。

linuxize.com

目前,大多数 Linux 发行版都预安装了 curl 包。

然而,当自动化时,你可能不希望期待它。我正在使用这个,但改进会很棒:)

if glide --version; then
    echo "Glide is installed"
else
    echo "Installing Glide."
    if curl; then
        curl https://glide.sh/get | sh
    elif wget; then
        wget https://glide.sh/get | sh
    else
        echo "curl and wget are not available, install glide manually"
    fi
fi

相关内容