【问题标题】:TCL - open a new terminal, do some operations in the opened terminal and close itTCL - 打开一个新终端,在打开的终端中做一些操作并关闭它
【发布时间】:2011-08-15 22:54:22
【问题描述】:

如何从 TCL 代码打开一个新终端,执行一些操作(例如 ls -l),获取这些操作的结果并关闭该终端?

exec 命令是否打开一个新终端,所有操作都在终端中调用,或者当我用 exec 调用例如“cd ..”时,该命令与 linux 终端和 linux 命令无关,这些是只是与 linux 标准命令同名的纯 tcl 命令?

【问题讨论】:

  • 您知道cd 是一个永远不应该在子进程中单独执行的命令吗? “当前目录”是一个概念,在所有操作系统上都是本地进程/继承的(嗯,可能不在 iOS 或 Android 上,但你没有处理它们)。
  • 我突然想到“打开一个新终端”可能意味着这是在远程系统上完成的。 是这样吗?如果是的话,它确实会改变解决方案的性质。
  • 您应该意识到,在 Linux(实际上在所有 unix 上)上,终端永远不会返回在其中执行的结果。事实上,它们经常返回 0 并且不向标准输出打印任何内容。在终端中执行操作的是 shell(bash、ksh、csh、zsh、tclsh),终端本身只是 GUI。所以如果你想要 shell 操作的结果,终端肯定不是你想要启动的。
  • 谢谢,你是对的!因此,我已经回答了我的问题。请看。 :))

标签: linux terminal tcl


【解决方案1】:

听起来你想要Expect

【讨论】:

    【解决方案2】:

    您传递给exec 的任何命令都将被发送到系统执行。 exec 不会打开终端窗口来执行此操作:它不需要像终端一样打开 GUI 窗口来与底层系统交互。

    关于您的示例命令的一些具体说明:

    • 不推荐解析lsls -l的输出。假设您有一个奇怪但有效的文件名,例如“foo\nbar”。您最好迭代 Tcl 的 glob 命令的结果。
    • cd 恰好是一个 Tcl 命令。

    【讨论】:

    • 在 Windows 上,它可能会强制打开终端。这取决于用于执行的操作。
    【解决方案3】:

    我已经完成了我的任务:

    set cvsUpdStr [exec $pathToCvsInYourSystem -qn upd]
    

    它不会打开终端,但它会执行任务:

    1. 执行命令
    2. 结果存储在cvsUpdStr,供以后使用

    还可以将它与catch 一起使用以了解它是否正确执行或避免错误:

    if {[catch {exec $pathToCvsInYourSystem -qn upd} result]} {puts $result} 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2020-01-20
      • 2014-11-23
      相关资源
      最近更新 更多