如何打印执行TCL脚本的行号?
#! /usr/bin/tclsh
set a "100"
set b "200"
set c [expr $a + $b]
puts [info script] ;# it will display the script name which it is executing.
# similarly I need to print the script line number.
puts $c
答案 0 :(得分:6)
您必须使用info frame
才能完成此操作。
info frame ?number?
此命令提供对堆栈中所有帧的访问,即使是从信息级别隐藏的那些帧也是如此。 如果未指定number,则此命令返回一个数字,给出命令的帧级别。如果在顶级调用该命令,则为1。 如果指定了number,则结果是一个字典,其中包含堆栈上编号级别的命令的位置信息。
如果number为正(> 0),那么它选择一个特定的堆栈级别(1指的是最顶层的活动命令,即info frame
本身,2指向它被调用的命令,所以上);否则它给出一个相对于当前命令的级别(0表示当前命令,即信息帧本身,-1表示其调用者,依此类推。)
我们将使用info frame
命令返回的字典。 其中一个关键是'line',其中包含脚本的行号。
有一个简单的proc
,
proc printLine {frame_info} {
# Getting value of the key 'line' from the dictionary
# returned by 'info frame'
set result [dict get [info frame $frame_info] line]
}
通常,来自[info frame $frame_info]
的结果字典将类似于
type source line 17 file /home/dinesh/stackoverflow/test cmd {printLine [info frame] } proc ::B level 1
由此,我们只是使用dict get
只需使用info frame
本身可以实现的上下文的当前帧号调用此proc。
即。
set lineNumber [printLine [info frame]]; #Place this line in your code.
此逻辑的演示如下。
<强> printLineNumber.tcl 强>
#!/usr/bin/tclsh
proc printLine {frame_info} {
# Getting value of the key 'line' from the dictionary
# returned by 'info frame'
set result [dict get [info frame $frame_info] line]
}
proc D {} {
puts "proc D"
puts [ printLine [info frame] ]
}
proc C {} {
puts "proc C"
puts [ printLine [info frame] ]
D
}
proc B {} {
puts "proc B"
puts [ printLine [info frame] ]
C
}
proc A {} {
puts "proc A"
puts [ printLine [info frame] ]
B
}
puts "Global"
puts [ printLine [info frame] ]
A