2011-11-08 3 views
2

私はtclでプログラミングしています(modulesコマンドで使用します)。私は、どのシェルがユーザーによって使用されているかを調べる必要があります。前にtclでプログラミングしたことがないので、私は単純なコードで何が間違っているのか分かりません。誰か助言してもらえますか?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

あなたは '$ shell'変数(' puts $ shell')respの出力を教えてください。 'module-info shell'の出力(' puts [module-info shell] ')? – bmk

答えて

3

単一引用符は、Tclでは特別な意味を持ちません。 Tclでは、二重引用符はシェルの二重引用符に似ており、中括弧({})はシェルの一重引用符に似ています。あなたは

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 
+0

あなたの提案に感謝します。スクリプトと二重引用符を重複させないように元の質問を更新しました。残念ながら、それは役に立たなかった。 – jlconlin

+1

あなたの編集内容には、puts文に引用符がありません。 –

+0

うん、私はクローズクォートが欠けていた。今はすべてが動作します。ありがとう! – jlconlin

1

2コメント:あなたが起こっている正確に何 を見ることができるように

  1. 使用は、$シェルの値を表示するには、を置きます。
  2. は、 の前に右中括弧と同じ行にする必要があります。
  3. あなたは$ shellの値が 'bash'だと言います。その場合は、の場合はを変更し、それを二重引用符で囲む必要があります。 "'bash'"
+0

@Brianの更新をありがとう。私の他のコメントでは、$ shellの値に単一引用符が含まれているわけではありませんでした。混乱させて申し訳ありません。簡単にするために私のオリジナルの質問を更新しました。 – jlconlin

1

問題はモジュールのソフトウェアを使用しているとき使用は置くべきではないということです。

modulesはちょっとシェルの環境に依存しない形であなたのシェル環境を変更するtclプログラムです。これは、単純なトリックを介して行われ、ご使用の環境を確認してください。

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

だからトリックは、現在のシェルによって評価され、適切な文字列を作成しています。それがあなたのシェルが評価しようと苦情を持っているべきであるということです働いた後、その文字列はそう何が起こっているはずSTDOUTから来て、「実行中のbash」私はあなたが追加した後に働いていることになっています理由として困惑してる

見積もりがありません。

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

コードとともにいくつかの説明を追加してください。 – Emyl

関連する問題