腳本內的 cURL
我正在嘗試解決 FreeBSD 伺服器上的一些問題,該伺服器間歇性地(隨機地)被網路防火牆阻止,無法通過 HTTPS 從網路伺服器下載某些文件。為了了解阻塞發生時會發生什麼,我需要執行以下 cURL:
curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null
然後讀取命令的stderr。但是,由於問題發生在無法預料的隨機時間,我想每 10 秒執行一次 curl 並將 stderr 儲存在一個文件中,以便稍後查看,我使用以下腳本(命名
cURLScript
)來實現這一點:#!/bin/sh while true do date echo "=================================" curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null 2>&1 echo "" sleep 10 done
然後我執行腳本:
/bin/sh cURLScript > log &
我希望該
log
文件將包含標準錯誤,但是,它沒有;缺少log
標準錯誤:Svr12loc:service 21] cat log Thu Mar 24 16:42:34 CET 2022 ================================= Thu Mar 24 16:43:03 CET 2022 ================================= Thu Mar 24 16:43:33 CET 2022 ================================= Thu Mar 24 16:44:02 CET 2022 ================================= Thu Mar 24 16:44:32 CET 2022 ================================= Thu Mar 24 16:45:00 CET 2022 =================================
有人可以建議我在這裡做錯了什麼嗎?
你的問題不清楚。我 猜你是這麼說的
- 你不關心 cURL 的 HTML 輸出(你發送到
HTMLFILE
),- 你關心“冗長”的資訊;
- 詳細消息將發送到終端(而不是
Log
文件),並且- 您希望他們轉到
Log
文件(而不是終端)。在 Unix(以及類 Unix 作業系統,甚至其他一些作業系統)中,程序有兩個自動輸出流:標準輸出(縮寫為“stdout”)和標準錯誤(縮寫為“stderr”)。顧名思義,stdout 用於主要輸出,stderr 用於錯誤消息和診斷。預設情況下,這兩個都指向終端。當您說 時
> HTMLFILE
,您將 cURL 的標準輸出重定向到HTMLFILE
. 但是冗長的消息被寫入標準錯誤。您想要的是將 cURL 的標準錯誤發送到腳本的標準輸出(即
Log
文件)。這在從 Bourne shell 派生的任何標準的、符合 POSIX 的 shell 中都很容易:
#!/bin/sh 雖然是真的 **做** 日期 迴聲“================================== curl --interface nic1 --verbose --insecure https://www.20min.ch ***2>&1* > HTMLPAGE** 迴聲“” 睡覺 10 **完畢**
2>&1
完全按照我上面所說的去做——將標準錯誤重定向到標準輸出。在 C shell 中更棘手:
#!/bin/csh **設置 t=`mktemp`** 而((1)) 日期 迴聲“================================== **(** curl --interface nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE **) *>& "$t"*** ***cat "$t"*** 迴聲“” 睡覺 10 結尾
在 csh 中,
>&
表示將 stdout 和 stderr 發送到以下文件。將它們發送到不同的地方(這是您想要的)很棘手。訣竅是將標準輸出發送到您想要的位置,然後將命令包裝在括號中,然後>&
在包裝的命令上使用。我不知道如何簡單地將標準錯誤發送到標準輸出。(可能有一種方法,我預計會被告知它是什麼。)上面,我使用了將 stderr 發送到臨時文件,然後將文件發送到 stdout 的技巧cat
。我鼓勵您在標準 shell 中編寫腳本。C shell 不適合編寫腳本。
PS 如果您不想保存 curl 的標準輸出,為什麼不將其發送到
/dev/null
?