ด้วยbash4.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