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



在我的主目录中,我有子目录(CentOS, Ubuntu等),所有这些都是我可以访问的特定节点。

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

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

    1. COMP1 is 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这样的东西。我可以有一个bash脚本,当从tcl脚本调用时输出lsb_release -si ?

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

    BASH脚本:

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


MODULEFILE脚本:

#%Modulefile1.0
set OS [catch {exec bash /path/to/bash_file} output]
puts $OS

选项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

你的代码大多看起来没有明显的错误。

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

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

还要确保您的bash脚本在末尾有一个显式的exit。最好确保它能正确停止。这是默认的行为,但由于这是一个(小)程序,因此最好在这里明确表示。

最新更新