【问题标题】:tcl: How to determine shell for module commandtcl:如何确定模块命令的外壳
【发布时间】:2011-11-08 15:43:34
【问题描述】:

我正在用 tcl 编程(用于 modules 命令)。我需要找出用户正在使用什么外壳。由于我以前从未在 tcl 中编程过,所以我不知道我的简单代码有什么问题。有人可以请教吗?

set shell [module-info shell]
if { $shell=="bash" } {
    puts "running bash"
}

我得到的错误(对不起,我最初没有包括它)是:

intel64(32):ERROR:102: Tcl command execution failed: if { $shell == "bash" } {
    puts "running bash
}

请注意,intel64 是找到此代码的文件,第 34 行是最后一行。

【问题讨论】:

  • 你能给我们输出$shell 变量(puts $shell)的输出吗? module-info shell 输出 (puts [module-info shell])?

标签: tcl


【解决方案1】:

单引号对 Tcl 没有特殊含义。在 Tcl 中,双引号类似于 shell 双引号,大括号 ({}) 类似于 shell 单引号。你会想写

if { $shell == "bash" } ...

请参阅此处记录的 Tcl 的完整语法:http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm

但这并不能解释错误消息。 Tcl 本身没有system 命令。我不能说这个“模块命令”是如何扩展 Tcl 的。试试

puts "running bash"

或者如果你真的很想使用echo,那么

exec echo running bash

【讨论】:

  • 感谢您的建议。我已经更新了我的脚本和原始问题以反映单引号和双引号。不幸的是,它没有帮助。
  • 是的,我错过了一个封闭的报价。现在一切正常。谢谢!
【解决方案2】:

2 厘米:

  1. 使用puts来显示$shell的值,这样你就可以 看看到底发生了什么。
  2. 您的 else 需要开启 与前面的右花括号相同的行。
  3. 你说$shell 的值是'bash'。如果是这样,那么您将需要更改您的 if 语句并在其周围加上双引号,例如“'bash'”

【讨论】:

  • 感谢@Brian 的更新。在我的另一条评论中,我并不是说 $shell 的值包括单引号。对困惑感到抱歉。更新了我原来的问题,使其更简单。
【解决方案3】:

问题是您不应该在使用模块软件时使用 puts。

modules 只是一个 tcl 程序,它以一种独立于 shell 的方式以某种方式修改你的 shell 环境。这是通过一个简单的技巧完成的,检查您的环境:

set | grep -A 10 module
...
module () 
{ 
    eval `/modules-3.2.9/Modules/$MODULE_VERSION/bin/modulecmd bash $*`
}

所以诀窍是创建一个正确的字符串,然后由当前的 shell 评估。该字符串来自stdout,所以在它工作之后应该发生的事情是你的shell应该抱怨试图评估“正在运行的bash”

我不明白为什么在你添加了缺失的报价后它应该起作用。

【讨论】:

    【解决方案4】:
    set shell $::env(SHELL)
    switch -glob $shell {
      "/bin/tcsh" -
      "/bin/csh" {
      setenv foamDotFile $env(FOAM_INST_DIR)/OpenFOAM-2.3.0/etc/cshrc
      }
      "/bin/ksh" -
      "/bin/bash" {
      setenv foamDotFile $env(FOAM_INST_DIR)/OpenFOAM-2.3.0/etc/bashrc
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 2015-10-19
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多