Đầu ra từ -x đi đến stderr, không phải stdout. Nhưng thậm chí đó có thể là một vấn đề - rất nhiều tập lệnh sẽ có các phụ thuộc chức năng vào nội dung của stderr, và loại lộn xộn của nó có các luồng gỡ lỗi và stderr trộn lẫn với nhau trong một số trường hợp.
Các phiên bản Bash> 4.1 cung cấp một giải pháp khác: biến môi trường BASH_XTRACEFD cho phép bạn chỉ định một bộ mô tả tệp sẽ được sử dụng để gửi luồng gỡ lỗi tới. Đây có thể là một tập tin hoặc đường ống hoặc bất kỳ lòng tốt unix-y nào bạn muốn.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
Với một chút khó khăn hơn, bạn có thể làm những việc khác - như thực hiện một 'tee' trên các luồng stdout và / hoặc stdin, và xen kẽ những thứ đó với đầu ra gỡ lỗi, để nhật ký của bạn hoàn thiện hơn. Để biết thêm chi tiết về điều này, hãy xem /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Ưu điểm lớn của phương pháp này so với các lựa chọn thay thế là bạn không mạo hiểm thay đổi hành vi của tập lệnh của mình bằng cách đưa đầu ra gỡ lỗi vào thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn.