Ini sepertinya versi yang paling aman.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
dapat dihapus dan tr
diganti dengan redirect (atau file dapat diganti dengan file yang dipisahkan nol sebagai gantinya). Hal ini terutama di sana karena saya terutama menggunakan xargs
dengan find
dengan -print0
output) (Ini mungkin juga relevan pada xargs
versi tanpa -0
ekstensi)
Aman, karena args akan meneruskan parameter ke shell sebagai larik ketika mengeksekusinya. Shell (setidaknya bash
) akan meneruskannya sebagai array yang tidak diubah ke proses lain ketika semua diperoleh dengan menggunakan["$@"][1]
Jika Anda menggunakan ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
, tugas akan gagal jika string berisi tanda kutip ganda. Ini berlaku untuk setiap varian yang menggunakan -i
atau-I
. (Karena itu diganti menjadi string, Anda selalu dapat menyuntikkan perintah dengan memasukkan karakter yang tidak terduga (seperti tanda kutip, tanda kutip atau tanda dolar) ke dalam data input)
Jika perintah hanya dapat mengambil satu parameter sekaligus:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Atau dengan proses yang agak kurang:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
Jika Anda memiliki GNU xargs
atau yang lain dengan -P
ekstensi dan Anda ingin menjalankan 32 proses secara paralel, masing-masing dengan tidak lebih dari 10 parameter untuk setiap perintah:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Ini harus kuat terhadap karakter khusus apa pun dalam input. (Jika inputnya dipisahkan nol). tr
Versi ini akan mendapatkan beberapa input yang tidak valid jika beberapa baris berisi baris baru, tetapi itu tidak dapat dihindari dengan file yang dipisahkan baris baru.
Parameter kosong pertama bash -c
adalah karena ini: (Dari bash
halaman manual ) (Terima kasih @clacke)
-c If the -c option is present, then commands are read from the first non-option argument com‐
mand_string. If there are arguments after the command_string, the first argument is assigned to $0
and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets
the name of the shell, which is used in warning and error messages.