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 {}
xargs 

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 {}

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 {} {}

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


2
Saya menambahkan beberapa format pada jawaban Anda agar lebih mudah dibaca. Saya harap saya memahaminya dengan benar.
fra-san
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.