我正在处理TCL脚本。当我运行tclsh script.tcl
时,脚本可以正常运行,但是当我运行source script.tcl
时,将不再找到命令。
#!/usr/bin/env tclsh
proc test {} {
set a 43
set b 27
set c [expr $a + $b]
set d [expr [expr $a - $b]* $c]
for {set k 0} {$k < 10} {incr k} {
if {$k < 5} {
puts "k<5, pow=[expr pow($d,$k)]"
} else {
puts "k>=5, mod=[expr $d % $k]"
}
}
}
...运行时会导致错误:
$ source myfirst.tcl
Command 'proc, not found, did you mean:
command 'croc' from snap croc (6.4.10)
command 'prof' from deb profphd
command 'nproc' from deb coreutils
command 'proj' from deb proj-bin
See 'snap info <snapname>' for additional versions.
bash: myfirst.tcl: line 7: syntax error near undexpected token `k'
[source
不能用于运行不是用您在其中调用它的shell的本机语言]编写的任何脚本。
即,在bash中,source
仅可用于运行bash脚本。它无法运行TCL脚本。本质上是这样的:source
的作用是跳过运行额外的shell或其他解释器
#!/usr/bin/env tclsh
shebang),然后在您已经在其中的shell中运行代码。如果该shell无法本地解析您正在编写的脚本所用的语言,则可能会出现语法错误-用一种语言编写的内容将由专门设计用于支持另一种语言的解释器进行解析。错误消息上的bash:
前缀清楚表明实际上是这种情况;是bash,不是tclsh
,试图解释脚本。
source
(还有.
)是POSIX类shell中存在的“内置”命令,它将从某个文件中执行命令在当前运行中
Tcl代码由Tcl解释器运行(通常为tclsh
或wish
,但是许多应用程序也嵌入了Tcl)。 Bash代码由bash解释器运行。两种语言仅具有极其肤浅的相似性。 source
命令就是其中之一,但是proc
是仅Tcl的命令(bash使用function
代替了这种命令)。