【问题标题】:"exec source <script>" does not work in tcl“exec source <script>”在 tcl 中不起作用
【发布时间】:2010-02-22 14:57:51
【问题描述】:

我正在尝试使用以下命令在 Tcl 中调用脚本:

exec source <script path>

我得到了错误

couldn't execute "source": no such file or directory

如何从 tcl 调用另一个脚本?

编辑:我正在运行从我办公室的另一个人那里得到的命令。我被指示使用源显式运行“源”。所以换句话说,我将如何运行任何可以在 cshell、Tcl 中运行的命令?

【问题讨论】:

  • 你能澄清一下其他脚本是用Tcl还是Csh写的?我假设 Tcl,其他人假设 Csh。
  • 脚本在cshell中。

标签: unix tcl csh


【解决方案1】:

如果给你的脚本是 cshell 脚本,你可以这样执行:

exec /bin/csh $path_to_script

实际上,这就是“source”命令在交互式 shell 中所做的事情。目前尚不清楚这是否真的是你想要做的(不完全是,但足够接近这个讨论)。

您无法执行 source 命令的原因是 exec 只能处理可执行文件(因此名称为“exec”)。 source 命令不是作为可执行文件实现的,它是 shell 内置的命令。因此,它不能被执行。

如果你真的觉得需要执行源命令或任何其他内置命令,你可以这样做:

exec /bin/csh -c "source $path_to_script"

在上面的示例中,您正在执行 c shell,并要求它运行命令“source”。对于 source 命令的具体情况,这并没有多大意义。

但是,我不确定这是否真的能达到您的预期。通常,如果有人说“这里有一些命令,只需执行 'source',它通常只是定义一些别名以及不能在交互式 shell 中使用的东西。这些别名在 Tcl 中不起作用。

【讨论】:

    【解决方案2】:

    csh 中的source 与 bash 中的 . 一样,执行脚本而不产生新进程。

    效果是该脚本中设置的任何变量在当前 csh 会话中都可用。

    实际上,source 是 csh 的内置命令,因此无法从 tcl 获得 exec,并且使用 exec 而不使用 source 不会给出特定的 source 效果。

    没有简单的方法可以解决您的问题。

    【讨论】:

    • 简而言之:exec 产生一个新进程,source 执行一个脚本而不产生一个新进程。
    【解决方案3】:

    source 加载源文件

    你应该这样做:

    source <script path>
    

    如果你想执行它,那么你需要调用main proc。

    另一种选择是:

    exec [info nameofexecutable] <scritp path>
    

    【讨论】:

    • 查看问题的编辑。我必须像从 c-shell 调用它一样运行命令“source
    • 嗨,Amir,exec 总是会调用操作系统可执行文件。如果您需要从 c-shell 或 bash 运行,或者...您需要使用第二个选项: exec [info nameofexecutable]
    • 我得到“无法读取文件“源”:没有这样的文件或目录”
    • 嗯,阿米尔,执行 'info nameofexecutable' 的结果是什么?我在很多地方的代码中都在做这种事情,而且它很有效。看来我们有点误会了。
    • 前面的错误是在使用'info nameofexecutable'时。我得到“无法读取文件”源“:没有这样的文件或目录”。
    【解决方案4】:

    这里有些混乱。 exec 运行一个单独的程序,可能带有参数。 source 不是一个单独的程序,它是另一个 Tcl 命令,它读取 Tcl 命令文件并执行它们,但不传递参数。如果您尝试调用的其他脚本被编写为从命令行运行,它将期望在变量 argv 中找到其参数作为列表。您可以通过在运行源代码之前将 argv 设置为参数列表来伪造这一点,例如。

    set argv {first_arg second_arg}
    source script_path
    

    或者,您可以使用 exec 启动一个完整的单独 Tcl 可执行文件并将脚本和参数传递给它:

    exec script_path first_arg second_arg
    

    【讨论】:

    • 第二个 deos 假定脚本本身在顶部具有必要的 exec 魔法以使其可执行,否则您可能需要 exec tclsh 或希望将其作为参数
    • 完全正确,谢谢,可能需要:exec tclsh script_path first_arg second_arg
    【解决方案5】:

    错误不言自明。确保提供正确的路径名,必要时指定完整路径。并确保该目录中确实存在该文件

    【讨论】:

      【解决方案6】:

      最近我想通过采购一个 shell 脚本来设置一些 UNIX 环境变量,但偶然发现了同样的问题。我发现这个简单的解决方案非常适合我:

      只需使用一个小的 3 行包装脚本,在您的 Tcl 脚本启动之前在 UNIX shell 中执行源命令。 示例:

      #!/bin/csh
      source SetMyEnvironment.csh
      tclsh MyScript.tcl
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-15
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 2017-05-05
        • 2023-03-30
        相关资源
        最近更新 更多