Menurut dokumentasi POSIX, xargs
harus menjalankan utilitas yang diberikan dengan argumen yang dibatasi oleh spasi atau baris baru, dan inilah yang terjadi pada dua contoh pertama Anda.
Namun, ketika --replace
(atau -I
) digunakan, hanya baris baru yang akan membatasi argumen. Obatnya adalah dengan memberikan xargs
argumen pada baris terpisah:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Menggunakan opsi POSIX:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Disini saya memberikan xargs
bukan satu baris tapi tiga. Dibutuhkan satu baris (paling banyak) dan mengeksekusi utilitas dengan itu sebagai argumen.
Perhatikan juga bahwa -n 1
(atau --max-args=1
) di atas tidak diperlukan karena ini adalah jumlah penggantian yang dibuat oleh -I
yang menentukan jumlah argumen yang digunakan:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
Faktanya, bagian Rationale dari spesifikasi POSIX di xargs
kata (penekanan saya)
-I
,-L
, dan-n
opsi saling eksklusif . Beberapa implementasi menggunakan yang terakhir ditentukan jika lebih dari satu diberikan pada baris perintah; implementasi lain memperlakukan kombinasi opsi dengan cara yang berbeda.
Saat menguji ini, saya perhatikan bahwa versi xargs
OpenBSD akan melakukan hal berikut jika -n
dan -I
digunakan bersama:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
Ini berbeda dengan xargs
coreutils GNU tidak (yang menghasilkan x a b c y
). Ini karena implementasi menerima spasi sebagai pembatas argumen dengan -n
, meskipun -I
digunakan. Jadi, jangan gunakan -I
dan -n
bersama-sama (toh tidak diperlukan).