我在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行是最后一行。
答案 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条评论:
答案 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
}
}