İşlevin dışa aktarılması bunu yapmalıdır (denenmemiş):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
printf
Harici yerine yerleşik olanı kullanabilirsiniz seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Ayrıca return 0
ve bunun exit 0
gibi bir yöntem kullanıldığında, kendisinden önceki komutun üretebileceği hata değerlerini maskeler. Ayrıca, herhangi bir hata yoksa, varsayılan ve bu nedenle biraz gereksizdir.
@phobic Bash komut bahseder olabilir için Basitleştirilmiş
bash -c 'echo_var "{}"'
{}
doğrudan içinde hareket . Ama bu kadar komut enjeksiyonu karşı savunmasız @Sasha tarafından belirttiği gibi.
Katıştırılmış biçimi kullanmamanız için bir örnek :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Neden olmasın başka bir örnek :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Güvenli biçimi kullanarak çıktı budur :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
Bu, enjeksiyondan kaçınmak için parametreli SQL sorguları kullanmakla karşılaştırılabilir .
Ben kullanıyorum date
bir komut yerine ya kaçan tırnak burada yerine içinde rm
o tahribatsız beri Sasha yorumunda kullanılan komuta.