Bu en güvenli sürüm gibi görünüyor.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
Kaldı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 xargs
ile find
birlikte -print0
çıkış) (Bu aynı zamanda alakalı olabilir xargs
olmadan 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, -i
veya 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 xargs
veya başka bir -P
uzantı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.) tr
Satı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 -c
budur: ( bash
Man 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.