Bagaimana cara mengulang variabel dua kali dalam xargs

21

Bagaimana saya bisa membuat gema kedua untuk menguji gema dalam contoh ini juga:

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

sumber
var=test & echo $var ...
alexus
xargs -I {} var = {} echo $ var && echo $ var Itu akan memberi Anda: Tidak ada file atau direktori.

Jawaban:

27

Tulis saja {}dua kali dalam perintah Anda. Berikut ini akan berfungsi:

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

Masalah Anda adalah bagaimana perintah bersarang . Mari kita lihat ini:

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

bash akan mengeksekusi echo test | xargs -I {} echo {}. Jika berhasil dijalankan, echo {}dieksekusi. Untuk mengubah sarang, Anda dapat melakukan sesuatu seperti ini:

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

Namun, Anda bisa mendapatkan masalah karena pendekatannya mungkin rentan terhadap injeksi kode. Ketika "test" diganti dengan kode shell, itu dijalankan. Oleh karena itu, Anda mungkin harus meneruskan input ke shell bersarang dengan argumen.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
JojOatXGME
sumber
3
Perhatikan bahwa Anda akan mendapatkan hasil yang tidak terduga dalam kode terakhir Anda jika Anda memiliki panggilan nirkabel, secara harfiah $(rm -f *),. Lebih baik melakukannyaxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda
@ Kusalananda, terima kasih. Saya menyadari masalahnya tetapi saya tidak bisa memikirkan solusi sederhana pada saat itu. Saya mengintegrasikan saran Anda ke dalam jawabannya.
JojOatXGME
5

Pilihan lain adalah menggunakan -iflag, yang sama dengan -I{}(ini menyiratkan bahwa penggantian diberikan bersama {}):

$ echo test | xargs -i echo {} {}
Omer Dagan
sumber
1
Sementara itu: This option is deprecated; use -I instead.telah ditambahkan ke manual man xargs.
Jonathan Komar
0

Bagi saya hanya huruf kecil yang berfungsi. Saya memiliki ratusan gambar dalam direktori dan ingin memasukkannya ke dalam daftar. -IPilihan huruf besar saya tidak bekerja untuk saya. Hanya huruf kecil. Mungkin karena perbedaan versi. Semua gambar ini memiliki nama seperti Daniel_(somenumber).jpg.

Sintaks ini berhasil:

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

Pengembalian:

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

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

Daniel Hudsky
sumber
2
Saya menambahkan beberapa format pada jawaban Anda agar lebih mudah dibaca. Saya harap saya memahaminya dengan benar.
fra-san