Với bash
4.1 trở lên, bạn có thể làm
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(cũng hoạt động khi bash
được gọi là sh
).
Về cơ bản, chúng tôi đang yêu bash
cầu xuất đầu xtrace
ra trên bộ mô tả tệp 7 thay vì mặc định là 2 và chuyển hướng mô tả tệp đó sang /dev/null
. Số fd là tùy ý. Sử dụng fd trên 2 mà không được sử dụng trong tập lệnh của bạn. Nếu shell bạn đang nhập lệnh này là bash
hoặc yash
, bạn thậm chí có thể sử dụng một số trên 9 (mặc dù bạn có thể gặp vấn đề nếu bộ mô tả tệp được sử dụng bên trong shell).
Nếu trình bao bạn đang gọi bash
tập lệnh đó là zsh
, bạn cũng có thể thực hiện:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
để biến được tự động gán fd miễn phí đầu tiên trên 9.
Đối với các phiên bản cũ hơn bash
, một tùy chọn khác, nếu xtrace
được bật bằng set -x
(trái ngược với #! /bin/bash -x
hoặc set -o xtrace
) sẽ xác định lại set
là một hàm được xuất mà không có gì khi được thông qua -x
(mặc dù điều đó sẽ phá vỡ tập lệnh nếu nó (hoặc bất kỳ bash
tập lệnh nào khác mà nó gọi) được sử dụng set
để đặt các tham số vị trí).
Giống:
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
Một tùy chọn khác là thêm bẫy DEBUG trong $BASH_ENV
tệp set +x
trước mỗi lệnh.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Điều đó sẽ không hoạt động khi set -x
được thực hiện trong một vỏ phụ.
Như @ilkkachu đã nói, miễn là bạn có quyền ghi vào bất kỳ thư mục nào trên hệ thống tập tin, ít nhất bạn sẽ có thể tạo một bản sao của tập lệnh và chỉnh sửa nó.
Nếu không có nơi nào bạn có thể viết một bản sao của tập lệnh hoặc nếu nó không thuận tiện để tạo và chỉnh sửa một bản sao mới mỗi khi có bản cập nhật cho tập lệnh gốc, bạn vẫn có thể thực hiện:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Điều đó (và cách tiếp cận sao chép) có thể không hoạt động chính xác nếu tập lệnh thực hiện bất kỳ thứ gì ưa thích với $0
hoặc các biến đặc biệt như $BASH_SOURCE
(chẳng hạn như tìm kiếm các tệp có liên quan đến vị trí của tập lệnh), vì vậy bạn có thể cần phải chỉnh sửa thêm như thay thế $0
bằng đường dẫn của tập lệnh ...
./script 2>some_file