xargsで変数を2回繰り返す方法


21

この例の2番目のエコーをエコーアウトテストにする方法は次のとおりです。

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
アレクサス

xargs -I {} var = {} echo $ var && echo $ varそれはあなたに与えます:そのようなファイルやディレクトリはありません。

回答:


27

{}コマンドに2回書くだけです。以下が機能します:

$ echo test | xargs -I {} echo {} {}
test test

問題は、コマンドがどのようにネストされているかです。これを見てみましょう:

echo test | xargs -I {} echo {} && echo {}

bashが実行されecho test | xargs -I {} echo {}ます。正常にecho {}実行されると、実行されます。ネスティングを変更するには、次のようにします。

echo test | xargs -I {} sh -c "echo {} && echo {}"

ただし、このアプローチではコードインジェクションが発生する可能性があるため、問題が発生する可能性があります。「test」がシェルコードに置き換えられると、実行されます。したがって、ネストされたシェルに引数を使用して入力を渡す必要があります。

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
文字通り、filed callodがある場合、最後のコードで予期しない結果が得られることに注意してください$(rm -f *)。行う方が良いxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda、ありがとう。私は問題を認識していましたが、その時点で簡単な解決策を考えることはできませんでした。あなたの提案を答えに統合しました。
JojOatXGME

5

別のオプションは-iflag を使用することです。これは同じです-I{}(置換がで与えられることを意味します{}):

$ echo test | xargs -i echo {} {}

1
それThis option is deprecated; use -I instead.までの間、マニュアルに追加されましたman xargs
ジョナサンコマー

0

私にとっては、小文字のみが機能します。ディレクトリに何百もの画像があり、それらをソースをリストに入れたいと思っていました。大文字のi -Iオプションは機能しませんでした。小文字のみ。おそらくバージョンの違いが原因です。これらの画像はすべてのような名前Daniel_(somenumber).jpgでした。

この構文は機能しました:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

戻り値:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw +#80 SMP x86_64 GNU / Linux


2
より読みやすくするために、回答に書式を追加しました。正しく理解できたことを願っています。
フラさん
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.