0

在我的主目录中,我有所有我可以访问的特定节点的子目录(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


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

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

    BASH 脚本:

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

模块文件脚本:

#%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 回答