Quoting
man xargs 說標準輸入由空格分隔;但是是嗎?
我對實際定義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。 此外,未加引號的空格不會終止輸入項;相反,分隔符是換行符。
不,這不是關於“塊”與“項目”的關係,這只是術語的轉換。接受用or
xargs
引用並用空格分隔的輸入,除非傳遞了某些選項。'``"
一些選項更改為不帶引號的逐行處理:
-I
,-L
,-i
(GNU),-l
(GNU)。該選項-0
(如果可用)更改為不帶引號的以空值分隔的輸入。選項-d
(GNU) 更改為不帶引號的自定義分隔符。