นี่น่าจะเป็นเวอร์ชั่นที่ปลอดภัยที่สุด
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
สามารถถอดออกและtr
แทนที่ด้วยการเปลี่ยนเส้นทาง (หรือไฟล์สามารถถูกแทนที่ด้วย null แยกไฟล์แทน). เป็นส่วนใหญ่ในที่นั่นตั้งแต่ผมส่วนใหญ่ใช้xargs
กับfind
กับ-print0
การส่งออก) (ซึ่งอาจจะเกี่ยวข้องในxargs
รุ่นโดยไม่ต้อง-0
ขยาย)
มีความปลอดภัยเนื่องจาก args จะส่งพารามิเตอร์ไปยังเชลล์เป็นอาร์เรย์เมื่อดำเนินการ เชลล์ (อย่างน้อยที่สุดbash
) จะผ่านมันเป็นอาร์เรย์ที่ไม่เปลี่ยนแปลงไปยังกระบวนการอื่นเมื่อทั้งหมดได้รับโดยใช้["$@"][1]
หากคุณใช้...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
การกำหนดจะล้มเหลวหากสตริงมีเครื่องหมายคำพูดคู่ นี้เป็นจริงสำหรับทุกตัวแปรที่ใช้หรือ-i
-I
(เนื่องจากมันถูกแทนที่เป็นสตริงคุณสามารถฉีดคำสั่งได้ตลอดเวลาโดยการใส่อักขระที่ไม่คาดคิด (เช่นอัญประกาศ backticks หรือเครื่องหมายดอลลาร์) ลงในข้อมูลอินพุต)
หากคำสั่งสามารถรับพารามิเตอร์ได้ครั้งละหนึ่งพารามิเตอร์เท่านั้น:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
หรือด้วยกระบวนการที่ค่อนข้างน้อย:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
หากคุณมี GNU xargs
หรืออื่นที่มี-P
ส่วนขยายและคุณต้องการเรียกใช้กระบวนการ 32 แบบขนานโดยแต่ละรายการมีพารามิเตอร์ไม่เกิน 10 พารามิเตอร์สำหรับแต่ละคำสั่ง:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
สิ่งนี้ควรมีความแข็งแกร่งเมื่อเทียบกับอักขระพิเศษใด ๆ ในอินพุต (หากอินพุตเป็นโมฆะคั่น) tr
เวอร์ชันจะได้รับอินพุตที่ไม่ถูกต้องหากบรรทัดบางบรรทัดมีบรรทัดใหม่ แต่ไม่สามารถหลีกเลี่ยงได้ด้วยไฟล์ที่คั่นด้วยบรรทัดใหม่
พารามิเตอร์แรกที่ว่างเปล่าสำหรับbash -c
เนื่องจาก: (จากbash
หน้าคน ) (ขอบคุณ @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.