xargs
我在和命令方面遇到了麻煩pipe
。這是一個例子 =
echo 'a' | xargs mkdir
此指令會建立一個名為 的目錄a
。所以我可以理解這個命令相當於mkdir a
但為什麼這個命令不起作用= echo 'a' | mkdir
?
我讀到該pipe
命令將左命令的輸出作為輸入傳遞給右命令,而| xargs
命令將左命令的輸出作為參數傳遞給右命令。
1-輸入和參數有什麼區別?
2-echo 'a' | mkdir
為什麼這個指令不起作用以及這個指令的等效項是什麼?
謝謝...
答案1
簡單回答
參數是輸入。
更長的答案
還有其他類型的輸入。
在您的範例中,echo 'a' | mkdir
您希望mkdir
讀取其標準輸入。然而,mkdir
並沒有編寫這樣做。
您所說的輸入是標準輸入(stdin
)。輸出為標準輸出 ( stdout
)。全部存在標準誤 ( stderr
)。和退出代碼。
甚至更長的答案——那麼有什麼區別呢?
參數必須在程式啟動之前可用。它通常是: 短;包含選項、檔案名稱和短文字。
標準輸入可以在程式運行時寫入;可以向其發送程式啟動時不存在的資料;不保證可以亂序讀取(所以按順序讀取);可以是任意長度;如果您需要更多發送檔案名稱作為參數,每個進程只有一個標準輸入;
echo 'a' | xargs mkdir
沒有怎麼辦xargs
mkdir "$(echo 'a')"
這些$()
方法運行包含的命令,然後$()
用該命令的標準輸出取代 及其內容。
答案2
我也曾為此困惑過很長一段時間。我將舉一個可能稍微簡單一點的例子(我到目前為止還不是 bash 專家):
wc "test"
wc <<< "test" (same as: echo "test" | wc)
這兩者的結果是非常不同的。第一個嘗試讀取文件test
,第二個顯示1 1 5
。
這裡的問題是wc "test"
得到爭論 "test"
作為輸入,而wc <<< "test"
需要標準輸入。
因此,當您發出echo 'a' | xargs mkdir
(xargs 代表:作為參數執行)時,您正在傳遞一個爭論到mkdir
;這就像做:mkdir a
。
另一方面,當您發出echo 'a' | mkdir
(更簡單的是mkdir <<< 'a'
:)時,您將a
作為標準輸入傳遞。
mkdir
對待這些事情的方式非常不同,因此你看到的結果是不同的。