条目man curl
说curl -O
:
如果您希望将文件保存在不同的目录中,请确保在使用 -O, --remote-name 标志调用curl 之前更改当前工作目录!
为什么无法将文件下载到特定目录而必须将cd /example
文件下载到特定目录?
我知道用这种方式是可能的wget
:
wget -P /example https://example.com/file
但我确实想知道为什么它似乎不与curl
.
答案1
为什么无法将文件下载到特定目录,而必须执行 cd /example 才能将文件下载到特定目录?
因为卷曲就是这样设计的。因为它是自由软件,您可以下载它的源代码(也许使用git clone https://github.com/curl/curl.git
)并研究它。你会发现目录(2)其中从未使用系统调用(它仅出现在用 Perl 编码的测试脚本中)。
如果您不想cd
在使用之前在 shell 中显式显示curl
,您可以使用其他内容,或者修补curl
源代码以添加这样的选项(例如,您可以改进其代码以接受某些--chdir
目录名程序选项,然后调用chdir
系统调用;在我看来,这不值得付出努力)。请记住,每个过程有它的自己的 工作目录(从其父进程继承)。也可以看看凭证(7)并阅读一些 Linux 编程书籍(可能是旧的,但可以免费下载,碱性磷酸酶;还简介(2)&系统调用(2))
当然,您可以curl
仅使用绝对路径(考虑使用真实路径(1)在你的 shell 脚本中,或者真实路径(3)在你的 C 程序中,得到一个)..
您还可以更简单地包含curl
一些外壳脚本做你想做的事;也许一些incurl
脚本就像这样简单:
#!/bin/sh
# this is your incurl shell script
cd "$1"
shift
exec curl "$@"
您将使用例如 with (从该 URLincurl /tmp/ -O foo http://example.com/path/foobar.txt
获取一些内容)。/tmp/foo
您也可以使用库卷曲图书馆,也许来自一些脚本语言(喜欢诡计,Python,卢阿,珀尔等...),或者来自用编译器实现的语言编写的程序(Rust、Go、C++、C、Ocaml...)。您甚至可以找到其他 HTTP 客户端库(以及 HTTP 服务器库)。
至于为什么curl设计师没有想到更多的功能、花哨的东西,请阅读有关Unix哲学。curl
是一个命令行软件,它只做一件事,但做得很好。您将与其他实用程序组合或包装它(可能与incurl
上面的脚本一样简单)以获得更多功能。可悲的是,curl
也不能为你做早晨咖啡。
附言。我假设您正在使用一些 POSIX 或类 Unix 操作系统,例如 Linux、MacOSX、AIX……
答案2
这是因为它就是这样curl
设计的。
尽管如此,您仍然可以通过 shell 重定向实现对输出目录的写入。例子:
$ curl http://example.com/file > /path/to/destination/file