Lệnh caller
được dựng sẵn (không được chỉ định bởi POSIX) đã xuất hiện trong Bash phiên bản 3.0 và nó trả về ngữ cảnh của bất kỳ lệnh gọi chương trình con đang hoạt động nào. Xem: Bash-Buildins để đọc thêm.
Cú pháp:
caller [FRAMENUMBER]
Nếu số khung được cung cấp dưới dạng số nguyên không âm, nó sẽ hiển thị số dòng, tên chương trình con và tệp nguồn tương ứng với vị trí đó trong ngăn xếp cuộc gọi thực hiện hiện tại.
Không có bất kỳ tham số nào, người gọi sẽ hiển thị số dòng và tên tệp nguồn của lệnh gọi chương trình con hiện tại.
Kiểm tra theo dõi ngăn xếp đơn giản sau đây tại Bash Hackers Wiki :
#!/bin/bash
die() {
local frame=0
while caller $frame; do
((frame++));
done
echo "$*"
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
Đầu ra:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
Dưới đây là mẫu của một die
hàm khá để theo dõi lỗi trong các tập lệnh phức tạp vừa phải:
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
Để gỡ lỗi tinh vi hơn, các tính năng gỡ lỗi mở rộng của Bash có sẵn và một số tham số đặc biệt cung cấp nhiều chi tiết hơn so với người gọi (ví dụ BASH_ARG{C,V}
). Các công cụ như Bashdb có thể hỗ trợ sử dụng một số tính năng gỡ lỗi nâng cao hơn của Bash.