ด้วยbash
4.1 ขึ้นไปคุณสามารถทำได้
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(ใช้ได้เมื่อbash
เรียกใช้เช่นกันsh
)
โดยทั่วไปเราบอกกำลังbash
จะเอาท์พุทxtrace
เอาท์พุทไฟล์อธิบาย 7 แทนการเริ่มต้นของ 2, /dev/null
และการเปลี่ยนเส้นทางที่จะอธิบายไฟล์ หมายเลข fd โดยพลการ ใช้ fd ด้านบน 2 ที่ไม่ได้ใช้ในสคริปต์ของคุณ หากเชลล์ที่คุณป้อนคำสั่งนี้เป็นbash
หรือyash
คุณสามารถใช้ตัวเลขที่สูงกว่า 9 (แม้ว่าคุณอาจพบปัญหาหากตัวบ่งชี้ไฟล์ถูกใช้ภายในโดยเชลล์)
หากเชลล์ที่คุณเรียกใช้bash
สคริปต์นั้นคือzsh
คุณสามารถทำ:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
สำหรับตัวแปรที่จะถูกกำหนดโดยอัตโนมัติ fd ฟรีครั้งแรกที่สูงกว่า 9
สำหรับเวอร์ชันเก่าของbash
ตัวเลือกอื่นหากxtrace
เปิดใช้งานด้วยset -x
(ตรงข้ามกับ#! /bin/bash -x
หรือset -o xtrace
) จะต้องกำหนดset
เป็นฟังก์ชันส่งออกที่ไม่ทำอะไรเลยเมื่อผ่าน-x
(แม้ว่าจะทำลายสคริปต์ถ้ามัน (หรือbash
สคริปต์อื่น ๆ ที่มันเรียก) ใช้set
เพื่อตั้งค่าพารามิเตอร์ตำแหน่ง)
ชอบ:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
ตัวเลือกอื่นคือการเพิ่มกับดัก DEBUG ใน$BASH_ENV
ไฟล์ที่ทำset +x
ก่อนทุกคำสั่ง
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
ที่ไม่ทำงานเมื่อset -x
เสร็จใน sub-shell แม้ว่า
ดังที่ @ilkkachu กล่าวว่าหากคุณได้รับอนุญาตให้เขียนไปยังโฟลเดอร์ใด ๆ ในระบบไฟล์อย่างน้อยที่สุดคุณควรจะสามารถทำสำเนาของสคริปต์และแก้ไขได้
หากไม่มีที่ใดที่คุณสามารถเขียนสำเนาของสคริปต์หรือหากไม่สะดวกในการสร้างและแก้ไขสำเนาใหม่ทุกครั้งที่มีการอัปเดตสคริปต์ต้นฉบับคุณอาจยังสามารถทำได้:
bash <(sed 's/set -x/set +x/g' ./script.bash)
นั้น (และวิธีการคัดลอก) อาจทำงานไม่ถูกต้องหากสคริปต์ทำสิ่งที่แฟนซีด้วย$0
หรือตัวแปรพิเศษเช่น$BASH_SOURCE
(เช่นค้นหาไฟล์ที่สัมพันธ์กับตำแหน่งของสคริปต์เอง) ดังนั้นคุณอาจต้องแก้ไขเพิ่มเติมเช่น แทนที่$0
ด้วยเส้นทางของสคริปต์ ...
./script 2>some_file