如何检索从tcl脚本运行的bashscript的输出< - (modulefile script)

时间:2016-08-20 21:55:59

标签: bash shell tcl environment modulefile

在我的家庭目录中,我有所有可访问的特定节点的子目录(CentOS,Ubuntu等)。

  • 每个操作系统都会拥有自己的程序副本,其中一个是Python:

    $HOME/{CentOS, Ubuntu, ...}/{python2,python3}
    
  • 我正在使用环境模块,以便当我ssh进入另一台计算机(COMP)时,将为该特定(COMP)设置Python别名。例如:

    1. COMP1是CentOS

      当我ssh进入COMP1时,“python3”应该指向$HOME/Centos/python3/bin/python3

    2. COMP2是Ubuntu

      当我ssh进入COMP2“python2”应该指向$HOME/Ubuntu/python2/bin/python2

我可以使用lsb_release -si在bash中检索操作系统名称,但我正在处理用tcl编写的模块文件,但没有找到类似lsb_release的内容。我是否可以使用从tcl脚本调用时输出lsb_release -si的bash脚本?

  • 我试过这样做但没有运气:

    BASH SCRIPT:

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

MODULEFILE SCRIPT:

#%Modulefile1.0

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

这没什么用。

2 个答案:

答案 0 :(得分: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

参考文献:env platform

答案 1 :(得分:0)

您的代码大多看起来并不明显错误。

但是[catch {exec ...} output]之后,您要查找的值应该在output变量中; OS变量将有一个代码,有效地指示bash脚本是否向stderr生成任何输出。由于您可能出于不易控制的原因而生成的调试输出肯定不感兴趣,因此您可以这样做:

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

另外,请确保您的bash脚本最后有一个明确的exit。不妨确保它正确停止。这是默认行为,但最好明确这一点,因为这是一个(小)程序。