Ini sepertinya versi yang paling aman.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0dapat dihapus dan trdiganti dengan redirect (atau file dapat diganti dengan file yang dipisahkan nol sebagai gantinya). Hal ini terutama di sana karena saya terutama menggunakan xargsdengan finddengan -print0output) (Ini mungkin juga relevan pada xargsversi tanpa -0ekstensi)
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 -iatau-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 xargsatau yang lain dengan -Pekstensi 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). trVersi 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 -cadalah karena ini: (Dari bashhalaman 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.