tcl:如何确定模块命令的shell

时间:2011-11-08 15:43:35

标签: tcl

我在tcl编程(用于modules命令)。我需要找出用户正在使用的shell。由于我以前从未在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行是最后一行。

4 个答案:

答案 0 :(得分:3)

单引号对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

答案 1 :(得分:1)

2条评论:

  1. 使用显示 $ shell 的值,以便您可以 看看究竟发生了什么。
  2. 您的其他需要启用 与之前的右花括号相同的行。
  3. 你说$ shell的价值是' bash'。如果是这样,那么您需要更改 if 语句并在其周围添加双引号,例如的"'的bash'"

答案 2 :(得分:1)

问题在于在使用模块软件时不应使用put。

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”

我很困惑为什么在你添加了缺失的引用之后它应该有效。

答案 3 :(得分:0)

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
  }
}