我正在编写一个需要从互联网下载一些数据的 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/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 年了。
目前,大多数 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