为什么我使用 'source' 到 运行 TCL 脚本时会出错?

Why do I get an error when I use 'source' to run a TCL script?

我现在正在研究 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 您在 [=24] 中调用它的 shell 母语编写的脚本=].

即在bash中,source只能用于运行bash脚本。它不能 运行 TCL 脚本。这是它的本质:source 所做的是 跳过 运行 一个额外的 shell 或其他解释器 (因此,迫使你的 #!/usr/bin/env tclsh shebang 被忽略),以及 运行 您已经进入的 shell 中的代码。

如果 shell 无法本地解析您所采购的脚本所用的语言,则可能会出现语法错误——用一种语言编写的内容正在由专门设计的解释器解析支持一个不同的。错误消息中的 bash: 前缀清楚地表明实际上就是这种情况;这是 bash,而不是 tclsh,试图解释脚本。

Tcl 代码是由 Tcl 解释器 运行 编写的(通常是 tclshwish,但许多应用程序也嵌入了 Tcl)。 Bash 代码由 bash 解释器 运行 编写。这两种语言只有极其表面的相似之处; source 命令就是其中之一,但是 proc 是一个仅限 Tcl 的命令(bash 有 function 而不是那种东西)。

这意味着无论 运行 那个 source 命令还需要了解目标文件的内容。