xargs は、2 番目のスクリプト引数を無視します。

xargs は、2 番目のスクリプト引数を無視します。

私は2つのパラメータを使用してbashスクリプトを呼び出しています。これをparam_oneandと呼びますparam_two。また、test2行のファイルがあります。

line_one
line_two

私のスクリプトは次のとおりです

cat test | xargs -I% bash -c 'echo % $1 $2;'

私が探している結果は次のとおりです。

line_one param_one param_two
line_two param_one param_two

しかし、私はこのような言葉を聞き続けます。

line_one
line_two

xargsスクリプトに複数のパラメータがある場合は無視されます。スクリプトをこのように変更しても印刷のみです。param_oneparam_one

cat test | xargs -I% bash -c 'printf '$1 $2';'

ただし、同じコマンドからスクリプトを呼び出すときは、%fromとfromの3つのパラメータの両方を使用する必要があります。これを行う適切な方法の提案がありますか、それとも不適切ですか?xargs$1$2xargsxargs

答え1

存在する:

cat test | xargs -I% bash -c 'echo % $1 $2;'

$1$2パラメータはリテラル文字列bash -c(インラインスクリプトなど)として渡されます。%スクリプト内でも拡張されるため、シェルコードとして扱われます。たとえば、test含まれている場合はコマンド;reboot;を呼び出しますreboot

このインラインスクリプトにパラメータを渡さないため、空白$1です$2

次のことができます。

< test xargs -I% bash -c 'echo "$1" "$2" "$3"' bash % "$1" "$2"

スクリプトの引数をインラインスクリプトに渡し、文字が含まれている$1場合は$2そこから拡張することもできます%xargs

したがって、環境を使用して次の値を渡すことができます。

< test PARAM1=$1 PARAM2=$2 xargs -I% bash -c '
  echo "$1" "$PARAM1" "$PARAM2"' bash %

また、xargs入力内容にいくつかの引用があることに注意してください。これは、各行の生のコンテンツをそのまま配信したい場合に使用するものではありません。 GNUを使用すると、xargs次のことができます。

< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"

また、変数を引用することを忘れないでください。よりprintf信頼できるecho滞在だからではない変える

関連情報