shell - 我怎样才能最便携地通过 HTTP 从 shell 脚本下载?我可以依靠 curl 或 wget 吗?
问题描述
我想编写一个可移植的 shell 脚本并在各种 Linux 系统上运行,也许还有其他 Unix 系统(*BSD、macOS)。该shell脚本需要下载文件。
哪个下载工具更有望默认预装?卷曲还是 Wget?
请注意,我对两者中哪一个当前“更好”或更受欢迎并不感兴趣。相反,我正在寻找代码尽可能少的最佳长期解决方案。
解决方案
如果您需要支持广泛的系统——从旧安装(更可能支持wget
)到未来安装(更可能支持curl
),您真的应该同时支持两者。
这可以通过一个检查哪个工具可用的 shell 函数来完成:
# usage: retrieve_url url
# results will be written to stdout
retrieve_url() {
if command -v curl >/dev/null 2>&1; then
curl --fail "$@"
elif command -v wget >/dev/null 2>&1; then
wget -O- "$@"
else
echo "ERROR: Unable to find either curl or wget" >&2
exit 1
fi
}
鉴于这种通用方法,应该可以将其扩展为也支持其他工具——例如通过运行仅运行标准库代码的嵌入式 Python 脚本。(在构建适合嵌入的 Python 下载脚本时可能遇到的问题,该脚本在 Python 2.5 和未来 3.x 版本之间的任何位置运行,最好单独询问,并标记为适当的社区)。
推荐阅读
- python - 在 Python 中解析响应
- javascript - 需要帮助 理解 javascript 图库代码
- database - thymeleaf hw 用模型属性填充 th:field 值
- android - 如何使用 ViewGroup 作为过渡动画的共享元素?
- amazon-web-services - 将内容从旧 EBS 卷复制到 AWS 中的新 Nitro 系统 EBS 的最佳方式(最简单/最快)?
- validation - 使用提示验证结构字段值的唯一性
- javascript - 在对象数组中,如何在 React 中按属性返回所有对象?
- java - 尝试实现媒体播放器
- javascript - 如何在迭代某些数据集的组件内保持项目的活动状态
- c++ - 如何在 C++ 中实现对向量的擦除