Saya mencoba menggunakan xargs untuk memanggil fungsi yang lebih kompleks secara paralel.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
Ini mengembalikan kesalahan
xargs: echo_var: No such file or directory
Setiap ide tentang bagaimana saya dapat menggunakan xargs untuk mencapai hal ini, atau solusi lain akan diterima.
Jawaban:
Mengekspor fungsi harus melakukannya (belum diuji):
Anda dapat menggunakan builtin
printf
alih-alih eksternalseq
:Juga, menggunakan
return 0
danexit 0
menyukai itu menutupi nilai kesalahan apa pun yang mungkin dihasilkan oleh perintah sebelumnya. Juga, jika tidak ada kesalahan, itu adalah default dan karenanya agak berlebihan.@ phobic menyebutkan bahwa perintah Bash dapat disederhanakan
memindahkan
{}
langsung di dalamnya. Tapi itu rentan terhadap injeksi perintah seperti yang ditunjukkan oleh @Sasha.Berikut adalah contoh mengapa Anda tidak boleh menggunakan format yang disematkan:
Contoh lain mengapa tidak :
Ini adalah keluaran yang menggunakan format aman :
Ini sebanding dengan menggunakan query SQL parameter untuk menghindari injeksi .
Saya menggunakan
date
substitusi perintah atau dalam tanda kutip di sini alih-alihrm
perintah yang digunakan dalam komentar Sasha karena itu tidak merusak.sumber
echo_var
, yang merupakan fungsi dalam skrip ini, bukan proses (program) di PATH Anda. Apa yang dilakukan solusi Dennis adalah mengekspor fungsi untuk proses bash anak untuk digunakan, kemudian bercabang ke subproses dan dijalankan di sana._
dan\
, tanpa mereka itu tidak bekerja untuk saya_
) menyediakan tempat penampung untukargv[0]
($0
) dan hampir semua hal bisa digunakan di sana. Saya rasa saya menambahkan backslash-semicolon (\;
) karena penggunaannya dalam mengakhiri-exec
klausafind
, tetapi berfungsi untuk saya tanpa itu di sini. Bahkan, jika fungsi itu digunakan$@
alih-alih$1
maka itu akan melihat titik koma sebagai parameter, sehingga harus dihilangkan.bash -c 'echo_var "{}"'
. Jadi Anda tidak perlu _ {} di akhir.Menggunakan GNU Parallel terlihat seperti ini:
Jika Anda menggunakan versi 20170822 Anda bahkan tidak perlu
export -f
selama Anda menjalankan ini:sumber
sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' sh: parallel_bash_environment: line 79: error sintaks: akhir tak terduga file sh: error mengimpor definisi fungsi untukparallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' / usr / local / bin / bash: parallel_bash_environment: line 79: kesalahan sintaks: akhir tak terduga dari file / usr / local / bin / bash: error mengimpor definisi fungsi untuk `...Sesuatu seperti ini juga bisa digunakan:
sumber
Mungkin ini adalah praktik yang buruk, tetapi Anda jika Anda mendefinisikan fungsi dalam
.bashrc
skrip atau lainnya, Anda dapat membungkus file atau setidaknya definisi fungsi dengan pengaturanallexport
:sumber