Bash
xargs 的意外輸出
下面的語句應該列印
afc abc
,但它會列印出來abc abc
。我嘗試了很多次,但每次都是相同的結果不知道為什麼會發生這種情況,有人可以解釋並幫助我嗎?echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}
是的,因為命令替換是由 shell 在
xargs
啟動之前執行的。替換中的echo
列印字元串{}
以供sed
操作。sed
沒有對其進行任何更改,結果是xargs
看到echo {} {}
反而:
echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
在這裡,我們通過將命令替換嵌入到內聯腳本中來防止 shell 評估命令替換。該腳本從命令行參數 (
abc
) 中獲得xargs
,並將其作為"$1"
.
printf
如果您想a
用破折號和其他字元替換將被解釋為以下選項的內容,則使用它會更好echo
:echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
或者,沒有
sed
:echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}
或者,您可以
sed
單獨完成(至少在這個簡單的範例中):echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'