使用 xargs 和管道將標準輸出轉換為不接受多個單詞的原始數據
我目前正在執行命令:
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
這些理解"..."
為一種引用機制,以防止和之間的空格hello
被world
視為參數分隔符。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
仍然進行一些引用處理,因此應該避免使用任意數據。