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

问题描述 投票:0回答:2

在我的主目录中,我有子目录(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 脚本:

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

模块文件脚本:

#%Modulefile1.0

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

这没什么作用。

bash shell tcl environment-modules modulefile
2个回答
1
投票

您的代码大部分看起来并没有明显错误。

但是在

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

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

还要确保您的 bash 脚本末尾有明确的

exit
。不妨确保它正确停止。这是 default 行为,但最好在这里明确,因为这是一个(小)程序。


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 平台

© www.soinside.com 2019 - 2024. All rights reserved.