Bash
什麼是“呼叫者”命令?
我正在執行帶有 openbox 的 Ubuntu 10.10。我今天注意到一個名為 的命令
caller
,但是沒有手冊頁,它不響應任何輸入(或 –help)並且 whereis 沒有找到它。知道它是什麼嗎?
跑步
type caller
你會看到它是一個內置的shell。跑步
help caller
將顯示其功能,以及在 bash 的手冊頁中報告。簡要地
Return the context of the current subroutine call.
is builtin 命令(
caller
POSIX 未指定)出現在 Bash 版本 3.0 中,它返回任何活動子常式呼叫的上下文。請參閱:Bash-Builtins了解更多資訊。句法:
caller [FRAMENUMBER]
如果幀號作為非負整數提供,則顯示目前執行呼叫堆棧中與該位置對應的行號、子常式名稱和源文件。
沒有任何參數,呼叫者顯示目前子程序呼叫的行號和源文件名。
在 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
輸出:
12 f1 ./callertest.sh 13 f2 ./callertest.sh 14 f3 ./callertest.sh 16 main ./callertest.sh *** an error occured ***
die
這是一個在中等複雜的腳本中跟踪錯誤的不錯的函式範例:{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
對於更複雜的調試,可以使用 Bash 擴展調試功能和一些比呼叫者更詳細的特殊參數(例如
BASH_ARG{C,V}
)。Bashdb等工具可以幫助使用 Bash 的一些更高級的調試功能。