Ubuntu 为什么在使用';来源';运行TCL脚本?

Ubuntu 为什么在使用';来源';运行TCL脚本?,ubuntu,tcl,ns2,tclsh,Ubuntu,Tcl,Ns2,Tclsh,我现在正在编写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}

我现在正在编写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]"
    }
  }
}
#/usr/bin/env tclsh
过程测试{}{
设定43
b组27
集合c[expr$a+b]
集合d[expr[expr$a-$b]*$c]
对于{set k 0}{$k<10}{incr k}{
如果{$k<5}{
放入“k=5,mod=[expr$d%$k]”
}
}
}
…运行时会导致错误:

$source myfirst.tcl
命令'proc,未找到,您的意思是:
来自snap croc的命令“croc”(6.4.10)
来自deb PROPHD的命令“prof”
来自deb coreutils的命令“nproc”
来自deb proj bin的命令“proj”
有关其他版本,请参见“快照信息”。
bash:myfirst.tcl:第7行:未预期标记“k”附近的语法错误

源代码
不能用于运行任何未使用调用它的shell的本机语言编写的脚本

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


如果该shell无法以本机方式解析编写源代码的脚本所用的语言,那么可能会出现语法错误——用一种语言编写的内容将由专门为支持另一种语言而设计的解释器进行解析。错误消息上的
bash:
前缀清楚地表明实际情况就是这样;试图解释脚本的是bash,而不是
tclsh

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

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


如果该shell无法以本机方式解析编写源代码的脚本所用的语言,那么可能会出现语法错误——用一种语言编写的内容将由专门为支持另一种语言而设计的解释器进行解析。错误消息上的
bash:
前缀清楚地表明实际情况就是这样;尝试解释脚本的是bash,而不是
tclsh

Tcl代码由Tcl解释器运行(通常是
tclsh
wish
,但许多应用程序也嵌入了Tcl)。Bash代码由Bash解释器运行。这两种语言只有极其肤浅的相似之处;
source
命令就是其中之一,但是
proc
是一个仅用于Tcl的命令(bash具有
函数
,而不是类似的功能)


这意味着运行
source
命令的任何程序都需要了解目标文件的编写内容。

Tcl代码由Tcl解释器运行(通常是
tclsh
wish
,但许多应用程序也嵌入了Tcl)。Bash代码由Bash解释器运行。这两种语言只有极其肤浅的相似之处;
source
命令就是其中之一,但是
proc
是一个仅用于Tcl的命令(bash具有
函数
,而不是类似的功能)


这意味着运行
source
命令的任何内容都需要了解目标文件是用什么编写的。

--问题本身中未包含的内容不计入“完成”帮助中心页面中描述的条件。具体来说:有人不能复制和粘贴屏幕截图中的代码来测试自己,或者进行一些更改并测试这些更改是否修复了您的错误。而且只有截图中的内容没有被搜索引擎索引,因此其他人无法找到问题并从其解决方案中学习……URL是误导性的(这里没有否决票,因为我只是通过自己转录图像来解决问题),但也请参见ns2的进一步解释:可执行的
ns
是“OTcl”解释器,因此可以省略第一行=
#/usr/bin/env tclsh
——问题本身中未包含的内容不计入帮助中心页面中描述的“完整”标准。具体来说:有人不能复制和粘贴屏幕截图中的代码来测试自己,或者进行一些更改并测试这些更改是否修复了您的错误。而且只有截图中的内容没有被搜索引擎索引,因此其他人无法找到问题并从其解决方案中学习……URL是误导性的(这里没有否决票,因为我只是通过自己转录图像来解决问题),但也请参见ns2的进一步解释:可执行的
ns
是“OTcl”解释器,因此可以省略第一行=
#/usr/bin/env tclsh
构建多语言脚本是可能的,但是做这么多事情确实很棘手(特别是如果你想以后也能编辑脚本,它们会退化为只写不好的东西,很容易)。构建多语言脚本是可能的,但做这么多事情确实很棘手(特别是如果您希望以后也能编辑脚本,它们会退化为只写不好的内容,以便轻松编辑)。如果你认为社区维基的答案不完整,请随意编辑。毕竟,这些答案归社区所有,而不是第一次发布它们的个人所有。在这种情况下,我发布CW是因为我绝对确定该问题是重复的,因此该答案将违反如何回答的“回答好问题”部分,但有困难