【问题标题】:How can I run a csh script from a tcl script?如何从 tcl 脚本运行 csh 脚本?
【发布时间】:2012-11-12 09:46:39
【问题描述】:

我正在尝试从 tcl 脚本运行 csh 脚本。

下面的tcl脚本调用了一个csh脚本

#!/usr/bin/tclsh


set scripts_path /scratch/TCL_scripts/scripts_adders

set synthesis /scratch/TCL_scripts/synthesis.csh


set files [glob -directory $scripts_path *]
split $files
set files [lsort $files]
set i 1

foreach script $files {

     puts "hello"
     # puts [pwd]
     exec /bin/csh -c $synthesis
     puts $i

}

并且(开头的)csh 文件如下:

#!/bin/csh -f


echo abcdefgh

当我只从我的 unix 终端执行 csh 文件时,它工作正常。 当我调用我的 Tcl 脚本时,它会运行并且确实会写入“hello”并打印 i,但不会执行 csh 文件,因为“abcdefgh”从未出现在终端中。我也尝试过其他命令,但我总是遇到同样的问题:当我从 Tcl 脚本运行 csh 脚本时,它永远不会执行,即使我直接从终端运行它时它运行良好。

(我的 Tcl 脚本和 csh 脚本都是可执行的)

我必须做什么才能从我的 Tcl 脚本运行我的 csh 脚本?

非常感谢

【问题讨论】:

  • 附带说明,对 [split $files] 的调用是无关的。首先, split 返回拆分列表,您没有保存结果。其次,因为 glob 已经将文件名作为列表返回,如果将其视为字符串并对其进行拆分,它最终会破坏带有空格的文件名。

标签: unix tcl csh


【解决方案1】:

确实为您运行了 csh 脚本,但默认情况下,它的标准输出成为 Tcl exec 命令的 result(如果它在标准错误中产生任何内容,那将变成 result em>错误 exec 的结果)。要使输出和错误出现在终端上,您必须像这样修改exec

exec /bin/csh -c $synthesis >@stdout 2>@stderr

>@ 表示“将标准输出重定向到以下通道”(在本例中为 stdout),2>@ 对标准错误执行相同操作。

【讨论】:

  • 你也可以做到puts [exec ...],但我认为我提出的更像你想要的。
  • @Scooter:作为exec 抛出的错误中的消息。这确实可能会丢失信息。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2012-03-05
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多