ฉันทำงานกับเชลล์สคริปต์ที่สร้างคำสั่งที่ซับซ้อนจากตัวแปรเช่นนี้ (ด้วยเทคนิคที่ฉันได้เรียนรู้จาก Bash FAQ ):
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
สคริปต์แบบนี้เพิ่มพารามิเตอร์--do-something "$SOME_ARG"และ--with "$ANOTHER_ARG"การsome_complex_commandหากตัวแปรเหล่านี้ถูกกำหนด จนถึงตอนนี้ก็ใช้งานได้ดี
แต่ตอนนี้ฉันต้องการพิมพ์หรือบันทึกคำสั่งเมื่อฉันใช้งานเช่นเมื่อสคริปต์ของฉันทำงานในโหมดดีบัก ดังนั้นเมื่อสคริปต์ของฉันทำงานsome_complex_command --do-something abc --with defฉันยังต้องการให้คำสั่งนี้อยู่ในตัวแปรเพื่อให้ฉันสามารถบันทึกลงใน syslog
Bash คำถามที่พบบ่อยแสดงให้เห็นถึงเทคนิคในการใช้DEBUGกับดักและ$BASH_COMMANDตัวแปร (ตัวอย่างเช่นสำหรับวัตถุประสงค์ในการแก้จุดบกพร่อง) สำหรับวัตถุประสงค์นี้ ฉันลองด้วยรหัสต่อไปนี้:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
ใช้งานได้ แต่ไม่ขยายตัวแปรในคำสั่ง:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
ฉันเดาว่าฉันต้องใช้ eval เพื่อขยายecho "$ARG"ไปยังecho test string(อย่างน้อยฉันก็ยังไม่พบวิธีที่จะevalทำได้) ต่อไปนี้ใช้งานได้:
eval echo "Command was: ${COMMAND}"
มันสร้างผลลัพธ์ต่อไปนี้:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
แต่ฉันไม่แน่ใจถ้าฉันสามารถใช้evalอย่างปลอดภัยเช่นนี้ ฉันพยายามหาประโยชน์บางอย่างไม่สำเร็จ:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
ดูเหมือนว่าจะจัดการกับเรื่องนี้ได้ดี แต่ฉันอยากรู้ว่าคนอื่นเห็นปัญหาที่ฉันพลาดหรือไม่