Saya tahu itu, mengingat l="a b c"
,
echo $l | xargs ls
hasil panen
ls a b c
Yang membangun menghasilkan
mycommand -f a -f b -f c
sumber
Saya tahu itu, mengingat l="a b c"
,
echo $l | xargs ls
hasil panen
ls a b c
Yang membangun menghasilkan
mycommand -f a -f b -f c
Salah satu cara untuk melakukannya:
echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand
Ini mengasumsikan a
,, b
dan c
tidak mengandung blank, baris baru, kutipan atau garis miring terbalik. :)
Dengan GNU findutil
Anda dapat menangani kasus umum, tetapi sedikit lebih rumit:
echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand
Anda dapat mengganti |
pemisah dengan beberapa karakter lain, yang tidak muncul dalam a
, b
atau c
.
Sunting: Seperti catatan @MichaelMol , dengan daftar argumen yang sangat panjang ada risiko meluap-luap dari panjang argumen maksimum yang bisa diteruskan mycommand
. Ketika itu terjadi, yang terakhir xargs
akan membagi daftar dan menjalankan salinan lain mycommand
, dan ada risiko itu meninggalkan yang tidak termotivasi -f
. Jika Anda khawatir tentang situasi itu, Anda bisa mengganti yang terakhir di xargs -0
atas dengan sesuatu seperti ini:
... | xargs -x -0 mycommand
Ini tidak akan menyelesaikan masalah, tetapi akan dibatalkan mycommand
saat daftar argumen terlalu panjang.
ARG_MAX
dan-f
memisahkan dari parameter yang dipasangkan.mycommand
. Anda selalu bisa menambahkan-x
yang terakhirxargs
.xargs
sama sekali, dan gunakan sajafind
jika dapat digunakan. Solusi ini berbahaya; Anda setidaknya harus memperingatkan kasus kegagalan dalam jawaban Anda.find
solusi umum yang lebih baik, terutama ketika argumen awal bukan nama file. :)-f
, dan dengan alat contoh yangls
digunakan untuk ilustrasi, @ not-a-user berurusan dengan nama file. Dan diberikanfind
menawarkan-exec
argumen, yang memungkinkan Anda untuk membangun command-line, tidak apa-apa. (Selamamycommand
diizinkan untuk mengeksekusi lebih dari sekali. Jika tidak, maka kita memiliki masalah lain dengan penggunaan dixargs
sini ...)Cara yang lebih baik untuk mengatasinya (IMO) adalah:
di
zsh
:atau menggunakan array zip sehingga argumen tidak dilampirkan ke opsi:
Dengan begitu, masih berfungsi jika
l
array berisi elemen kosong atau elemen yang berisi spasi atau karakter bermasalah lainnyaxargs
. Contoh:di
rc
:di
fish
:(AFAIK,
rc
danfish
tidak memiliki zipping array)Dengan kerang mirip Bourne gaya lama
bash
, Anda selalu dapat melakukannya (masih mengizinkan karakter apa pun di elemen$@
array):sumber
for i; do args+=('-f' "$i");done;
mycommand "${args[@]}"
. IDK jika ini lebih cepat, tetapi menambahkan 2 elemen ke array sepertinya itu harus O (n), sementaraset
loop Anda mungkin menyalin dan mem-parsing daftar arg akumulasi setiap waktu (O (n ^ 2)).