0

我现在正在研究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'
4

2 回答 2

1

source不能用于运行任何不是以您调用它的 shell 的本地语言编写的脚本。

也就是说,在 bash 中,source只能用来运行 bash 脚本。它不能运行 TCL 脚本。这是本质上的:source跳过运行额外的 shell 或其他解释器(因此,强制你的#!/usr/bin/env tclshshebang 被忽略),并在你已经在其中的 shell 中运行代码。

如果该 shell 无法本地解析您编写的脚本所用的语言,则可以预期语法错误 - 以一种语言编写的内容正在由专门为支持另一种语言而设计的解释器进行解析。错误消息上的bash:前缀清楚地表明这是实际情况;它是 bash,而不是tclsh,试图解释脚本。

于 2020-02-21T23:36:59.860 回答
1

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

这意味着无论运行该source命令的任何内容都需要了解目标文件的写入内容。

于 2020-02-22T07:30:36.003 回答