การส่งออกฟังก์ชันควรทำ (ยังไม่ได้ทดสอบ):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
คุณสามารถใช้ builtin printf
แทนการใช้ภายนอกseq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
นอกจากนี้การใช้return 0
และexit 0
เช่นนั้นจะปิดบังค่าความผิดพลาดใด ๆ ที่อาจเกิดขึ้นจากคำสั่งก่อนหน้า นอกจากนี้หากไม่มีข้อผิดพลาดก็เป็นค่าเริ่มต้นและค่อนข้างซ้ำซ้อน
@phobic กล่าวถึงว่าคำสั่ง Bash สามารถทำให้ง่ายขึ้น
bash -c 'echo_var "{}"'
ย้าย{}
ภายในโดยตรง แต่มันมีความเสี่ยงที่จะสั่งการฉีดตามที่ระบุไว้โดย @Sasha
นี่คือตัวอย่างทำไมคุณไม่ควรใช้รูปแบบฝังตัว:
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
อีกตัวอย่างหนึ่งที่ทำไม :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
นี่คือผลลัพธ์ที่ใช้รูปแบบที่ปลอดภัย :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
ก็เปรียบได้กับการใช้พารามิเตอร์ SQL คำสั่งที่จะหลีกเลี่ยงการฉีด
ฉันกำลังใช้date
ในการทดแทนคำสั่งหรือคำพูดที่หลบหนีที่นี่แทนrm
คำสั่งที่ใช้ในความคิดเห็นของ Sasha เพราะมันไม่ทำลาย