Değişkenleri xargs içinde iki kez tekrarlama


22

Bu örnekte de testi yankılamak için ikinci yankıyı nasıl yapabilirim:

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

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Size verecek olan: Böyle bir dosya veya dizin yok.

Yanıtlar:


29

Sadece {}komutuna iki kez yaz . Aşağıdakiler işe yarar:

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

Sorununuz komutların nasıl iç içe yerleştirildiğidir . Şuna bir bakalım:

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

bash yürütülür echo test | xargs -I {} echo {}. Başarılı bir şekilde çalışırsa echo {}yürütülür. Yuvalamayı değiştirmek için şöyle bir şey yapabilirsiniz:

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

Ancak, sorun alabilirsiniz çünkü yaklaşım kod enjeksiyonuna eğilimli olabilir. "Test" kabuk kodu ile değiştirildiğinde, yürütülür. Bu nedenle, girdiyi büyük olasılıkla yuvalanmış kabuğa argümanlarla iletmeniz gerekir.

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

3
Kelimenin tam anlamıyla, belirtme çizgisi varsa, son kodunuzda beklenmedik sonuçlar elde edeceğinizi unutmayın $(rm -f *). Daha iyixargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda, teşekkürler. Sorunun farkındaydım ama o anda basit bir çözüm düşünemedim. Önerinizi cevaba entegre ettim.
JojOatXGME

5

Başka bir seçenek de, -iişaretiyle aynıdır -I{}(değiştirmenin verildiği anlamına gelir {}):

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

1
Bu arada: This option is deprecated; use -I instead.kılavuza eklendi man xargs.
Jonathan Komar

0

Benim için sadece küçük harf çalışıyor. Bir dizinde yüzlerce resim vardı ve onları bir listeye almak istedim. Büyük harf i -Iseçeneği benim için çalışmadı. Sadece küçük harf. Muhtemelen sürüm farklılıkları nedeniyle. Bu görüntülerin hepsinin adı vardı Daniel_(somenumber).jpg.

Bu sözdizimi çalıştı:

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

İadeler:

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

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


2
Cevabınızı daha okunabilir hale getirmek için bazı biçimlendirmeler ekledim. Umarım doğru anladım.
fra-san
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.