Directory

curl -O:為什麼不能下載文件特定目錄?

  • January 13, 2018

man curl條目curl -O說:

如果您希望文件保存在不同的目錄中,請確保在使用 -O, –remote-name 標誌呼叫 curl 之前更改目前工作目錄!

為什麼無法將文件下載到特定目錄而必須cd /example將文件下載到特定目錄?

我知道用wget這種方式是可能的:

wget -P /example https://example.com/file

但我確實想知道為什麼它似乎不與curl.

這是因為它是如何curl設計的。

您仍然可以通過 shell 重定向實現寫入輸出目錄。例子:

$ curl http://example.com/file > /path/to/destination/file

為什麼無法將文件下載到特定目錄而必須執行 cd /example 才能將文件下載到特定目錄?

因為curl就是這樣設計的。由於它是免費軟體,您可以下載它的原始碼(可能帶有git clone https://github.com/curl/curl.git)並研究它。您會發現chdir(2)系統呼叫從未在其中使用過(它只出現在用 Perl 編碼的測試腳本中)。

如果您不想cd在使用之前顯式地在 shell 中顯示curl,您可以使用其他東西,或者修補curl原始碼以添加這樣的選項(例如,您可以改進其程式碼以接受一些--chdir dirname程序選項,然後呼叫chdir syscall;在我看來,這不值得努力)。請記住,每個程序都有自己的 工作目錄(繼承自其父程序)。另請參閱credentials(7)並閱讀一些 Linux 程式書籍(可能是舊的但可免費下載的ALP;還有intro(2)syscalls(2)

當然,你可以curl只使用絕對路徑(考慮在你的 shell 腳本中使用realpath(1) ,或者在你的 C 程序中使用realpath(3)來獲得一個)..

您還可以更簡單地包裝curl一些shell 腳本來做您想做的事情;也許一些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

您也可以使用libcurl庫,可能來自某些腳本語言(如GuilePythonLuaPerl等),或者來自用編譯器實現的語言(Rust、Go、C++、C、Ocaml)編寫的程序, ….)。您甚至可以找到其他 HTTP 客戶端庫(以及 HTTP 伺服器庫)。

至於為什麼 curl 設計者沒有想到更多的功能,花里胡哨,請閱讀Unix 哲學curl是一個命令行軟體,它只做一件事,但做得很好。incurl您將使用其他實用程序(可能與上面的腳本一樣簡單)組合或包裝它以獲得更多功能。可悲的是,curl也不會讓你早上喝咖啡。

PS。我假設您正在使用一些 POSIX 或類似 Unix 的作業系統,例如 Linux、MacOSX、AIX…

引用自:https://unix.stackexchange.com/questions/416759