【问题标题】:Why do I get an error when I use 'source' to run a TCL script?为什么我在使用“source”运行 TCL 脚本时会出错?
【发布时间】:2020-02-21 23:19:29
【问题描述】:

我现在正在处理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'

【问题讨论】:

  • Why not upload images of code on SO when asking a question? -- 未包含在问题本身的内容不计入minimal reproducible example 页面中描述的“完整”标准帮助中心。
  • 具体来说:有人无法从屏幕截图中复制并粘贴代码来自己测试,或者进行一些更改并测试这些更改是否能修复您的错误。并且仅在屏幕截图中的内容不会被搜索引擎索引,因此其他人无法找到问题并从其解决方案中学习。
  • ...该 URL 具有误导性(这里没有反对意见,因为我只是通过自己转录图像来解决问题),但另请参阅 idownvotedbecau.se/imageofcode 的进一步解释
  • ns2 : 可执行文件ns "OTcl" 解释器,所以你可以省略第一行 = #!/usr/bin/env tclsh

标签: ubuntu tcl ns2 tclsh


【解决方案1】:

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

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

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

【讨论】:

  • 可以构建多语种脚本,但是做这么多真的很棘手(特别是如果您希望之后也能够编辑脚本;它们很容易退化为只写的讨厌) .
【解决方案2】:

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

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

【讨论】:

  • 如果您认为社区 Wiki 的答案不完整,请随时编辑它们——毕竟它们属于社区,而不是最初发布它们的个人。在这种情况下,我发布 CW 是因为我绝对确定该问题是重复的,因此回答将违反如何回答的“回答好问题”部分,但在运行它时遇到了麻烦(我们'有人尝试从 bash 获取 Python 或其他非 bash 脚本,但很难找到好的搜索词!)
  • @CharlesDuffy 我一直拒绝社区 wiki 答案的概念(但其原因在这里并不重要;我不会争论这个问题)。 您的答案是从 bash 的角度,我的答案是从 Tcl 的角度。
猜你喜欢
  • 2020-05-31
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多