Quoting

man xargs 說標準輸入由空格分隔;但是是嗎?

  • February 16, 2018

我對實際定義arg in的內容感到困惑xargs

手冊頁似乎暗示 args 由空格分隔(我認為這意味著空格)。但是,以下腳本的行為與我預期的不同。以下是 man 描述部分的摘錄:

xargs 從標準輸入讀取項目,由空格(可以用雙引號或單引號或反斜杠保護)或換行符分隔,並執行命令…

似乎 xargs 可能在手冊頁稱為items的**塊中起作用。這意味著一個項目,還是一個分隔的項目? null-delimited``newline

基本上,我不明白為什麼在以下腳本xargs中將輸入視為單個 arg,即使空格(在標準輸入中)不受保護。我希望xargs將 stdin 視為 3 個 args,或者至少將多個空格減少到一個空格,但這些都不做!

#!/bin/bash
if [[ $1 == "." ]] ;then  # act on a recursive call to self
   shift                 # scrap the 'recursive' arg
   printf '|%s|\n' "$@"  # print all 'xargs' args
   printf '|%s|\n' "$1"  # print only the first 'xargs' arg
   exit
fi
printf 'a    b    c\n' |xargs -I {} "$0" "." {}   

這是輸出;僅顯示一個 arg 已傳遞給腳本。

|a    b    c|
|a    b    c|

但我本來期望 3 個單獨的參數,像這樣:

|a|
|b|
|c|

-I閱讀手冊頁中有關您正在使用的 option的內容:

-I 替換-str

用從標準輸入讀取的名稱替換初始參數中出現的 replace-str。 此外,未加引號的空格不會終止輸入項;相反,分隔符是換行符。

不,這不是關於“塊”與“項目”的關係,這只是術語的轉換。接受用orxargs引用並用空格分隔的輸入,除非傳遞了某些選項。'``"

一些選項更改為不帶引號的逐行處理:-I, -L, -i(GNU), -l(GNU)。該選項-0(如果可用)更改為不帶引號的以空值分隔的輸入。選項-d(GNU) 更改為不帶引號的自定義分隔符。

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