Bu en güvenli sürüm gibi görünüyor.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0Kaldırılabilir ve tr) bir yönlendirme ile değiştirilmiştir (veya dosya null ile değiştirilebilir yerine dosyayı ayırdı. Ben ağırlıklı olarak kullandığından İçerisi ağırlıklı olduğu xargsile findbirlikte -print0çıkış) (Bu aynı zamanda alakalı olabilir xargsolmadan sürümleri-0 uzantısı)
Güvenlidir, çünkü args parametreleri yürütürken parametreleri bir kabuk olarak geçirir. Kabuk (en azındanbash ) daha sonra, tümü kullanılarak elde edildiğinde, bunları değiştirilmemiş bir dizi olarak diğer işlemlere geçirir.["$@"][1]
Eğer kullanırsanız ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' '', dizede çift tırnak varsa atama başarısız olur. Bu, -iveya kullanan her varyant için geçerlidir -I. (Bir dizeye değiştirildiği için, giriş verilerine beklenmedik karakterler (tırnak işaretleri, ters işaretler veya dolar işaretleri gibi) ekleyerek her zaman komut enjekte edebilirsiniz)
Komutlar bir kerede yalnızca bir parametre alabilirse:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Veya biraz daha az süreçle:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
GNU xargsveya başka bir -Puzantıya sahipseniz ve her biri her komut için 10'dan fazla parametre içermeyen 32 işlemi paralel olarak çalıştırmak istiyorsanız:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Bu, girişteki özel karakterlere karşı sağlam olmalıdır. (Girdi boş bırakılmışsa.) trSatırlardan bazıları yeni satır içeriyorsa sürüm geçersiz bir giriş alır, ancak bu satır yeni satır ayrılmış bir dosyayla kaçınılmazdır.
İçin boş ilk parametrenin nedeni bash -cbudur: ( bashMan sayfasından ) (Thanks @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.