Saya mencoba menggunakan xargs untuk menjalankan perintah untuk setiap argumen yang diberikan, tetapi sayangnya flag --replace / -I tampaknya tidak berfungsi dengan baik ketika dikonjugasikan dengan -n. Tampaknya {} akan berkembang menjadi daftar argumen lengkap yang dibaca dari stdin, terlepas dari opsi -n.
Sayangnya semua contoh di web tampaknya untuk perintah (mv, cp, rm) yang akan mengambil banyak argumen di mana {} diperluas.
Misalnya, saat menjalankan:
echo a b c d | xargs -n 1 -I {} echo derp {}
Outputnya adalah:
derp a b c d
Tapi saya berharap:
derp a
derp b
derp c
derp d
Namun, menjalankannya tanpa -I {} menghasilkan hasil yang diharapkan:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Apakah ada cara untuk mencapai ini dengan xargs? Tujuan utama saya adalah menggunakannya untuk menjalankan beberapa sesi (parralel) ssh, misalnya
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Saya menjalankan xargs (GNU findutils) 4.4.2
di RHEL 6.3.
xargs
, tapi tidak GNUxargs
.man xargs
pada-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Jadi berperilaku seperti yang dirancang.Jawaban:
Anda dapat bergaung dengan baris baru untuk mencapai hasil yang diharapkan. Dalam kasus Anda dengan ekspansi server yang akan menjadi:
sumber
zsh
... Memperbaiki jawaban saya.echo
membutuhkan-e
opsi.Anda dapat menggunakan pipa tambahan seperti ini,
Penggunaan perantara dari 'gema' masing-masing xargs 'abcd' secara individual karena opsi '-n1'. Ini menempatkan setiap huruf pada barisnya sendiri seperti ini,
Sangat penting untuk dipahami ketika menggunakan -I (penggantian string), xargs menyiratkan -L, yang mengeksekusi perintah utilitas (dalam kasus Anda gema) sekali per baris. Juga, Anda tidak dapat menggunakan -n dengan -L karena keduanya saling eksklusif.
sumber