0

私のホームディレクトリには、アクセスできる特定のノード用のサブディレクトリ (CentOS、Ubuntu など) があります。

  • 各 OS は独自のプログラムのコピーを保持しており、そのうちの 1 つが Python です。

    $HOME/{CentOS, Ubuntu, ...}/{python2,python3}
    
  • 環境モジュールを使用しているためssh、別のコンピューター (COMP) に接続すると、その特定の (COMP) に Python エイリアスが設定されます。例えば:

    1. COMP1 は CentOS です

      COMP1にssh入ると、「python3」が指すはずです$HOME/Centos/python3/bin/python3

    2. COMP2はUbuntuです

      sshがCOMP2に入るとき、「python2」は指す必要があります$HOME/Ubuntu/python2/bin/python2


を使用して bash で OS 名を取得できますがlsb_release -si、tcl で記述されたモジュール ファイルを使用しており、 lsb_release. lsb_release -siTcl スクリプトから呼び出されたときに出力する bash スクリプトを作成できますか?

  • 私はこれをやろうとしましたが、運がありません:

    バッシュスクリプト:

    #!/bin/bash
    
    OS=$(lsb_release -si)
    echo $OS
    

MODULEFILE スクリプト:

#%Modulefile1.0

set OS [catch {exec bash /path/to/bash_file} output]
puts $OS

これはあまり効果がありません。

4

2 に答える 2

0

オプション A: bash で変数をエクスポートし、tcl で環境変数にアクセスします。

#!/bin/bash
OS=$(lsb_release -si)
export OS
somescript.tcl

#!/usr/bin/tclsh
puts $::env(OS)

オプション B: tcl に付属のプラットフォーム パッケージを使用します。

#!/usr/bin/tclsh
package require platform
puts [platform::identify] ; # detailed OS-CPU
puts [platform::generic] ; # more generic OS-CPU

参考文献:環境 プラットフォーム

于 2016-08-21T08:02:19.163 に答える
0

あなたのコードはほとんど明らかに間違っているようには見えません。

ただし、[catch {exec ...} output]探している値はoutput変数にある必要があります。このOS変数には、bash スクリプトが stderr への出力を生成したかどうかを効果的に示すコードが含まれます。簡単に制御できない理由で生成される可能性のあるデバッグ出力には絶対に興味がないので、おそらく次のようにすることができます。

catch {exec bash /path/to/bash_file 2>/dev/null} output
puts $output

また、bash スクリプトexitの最後に明示的な記述があることを確認してください。正しく停止することを確認することもできます。これがデフォルトの動作ですが、これは (小さな) プログラムであるため、ここで明示することをお勧めします。

于 2016-08-21T08:05:13.853 に答える