Curl

使用 xargs 和管道將標準輸出轉換為不接受多個單詞的原始數據

  • February 9, 2019

我目前正在執行命令:echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"它採用標準輸出,echo "hello world"然後通過管道將其傳遞給func_wordcount使用該-d選項。該-d選項用於發送原始數據,而我func_wordcount的輸入原始數據並列印單詞數和字母數。

例如,當我寫echo "hello" | xargs curl http://localhost:8080/function/func_wordcount -d"輸出是: 1, 5 表示有一個單詞包含 5 個字母。

但是,當我嘗試包含許多單詞時,會出現錯誤。當我寫作時,echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"我得到輸出 1、5,然後是一個帶有錯誤的換行符:curl: (6) could not resolve host: world-d所以我很確定當我使用該選項將標準輸出轉換為原始數據時,它會將 hello world 分成兩個單詞。

此外,只是為了表明該函式在沒有管道和轉換的情況下工作,當我執行我的函式時,curl http://localhost:8080/function/func_wordcount -d "hello world"我得到 2, 11 表明有兩個單詞和 11 個字元。

我的問題是如何解決這個分裂問題。我感到困惑的部分是為什麼它只解析輸入的前半部分並完成它,然後在第二部分拋出錯誤,而不是只發送一大塊數據。我只能發送根本沒有用空格分隔的輸入,因此功能的使用變得非常有限。

就是這樣xargs。它在其標準輸入上獲取一個單詞列表(空白或換行符分隔,也理解某種形式的引用),並將它們作為參數傳遞給它執行的命令。

在這裡,如果你想hello word作為一個參數傳遞給curl,你需要:

echo '"hello world"' | xargs curl...

Where將xargs這些理解"..."為一種引用機制,以防止和之間的空格helloworld視為參數分隔符。xargs也理解\'...'(以與 POSIX shell 不同的方式)。

使用 GNU xargs,您還可以指定分隔符。例如:

echo hello world | xargs -d '\n' curl...

只有換行符會被理解為分隔符(不是空格),並且引用機制被禁用。

這使您可以將每一行的內容(而不是每個單詞)作為參數傳遞給命令。

雖然-d在 GNU 之外很少支持xargs, -0,但它的另一個擴展(用於分隔 NUL 和禁用引用處理)得到了更廣泛的支持。所以你也可以這樣做:

echo hello world | tr '\n' '\0' | xargs -0 curl...

如果有幾行輸入,xargs會將它們作為單獨的參數傳遞給curl. 如果您想curl為每一行呼叫一個,您可以添加一個-n 1選項。

您還可以使用:

echo hello world | xargs -I@@ curl... @@

每一行都呼叫一個curl,但請注意,前導空格被剝離並且xargs仍然進行一些引用處理,因此應該避免使用任意數據。

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