Как получить вывод из bashscript, который вы запускаете из сценария tcl <- (скрипт modulefile)

В моем домашнем каталоге у меня есть подкаталоги (CentOS, Ubuntu и т. Д.), Все для определенных узлов, к которым у меня есть доступ.

  • Каждая ОС будет содержать свою собственную копию программ, одной из которых является Python:

    $HOME/{CentOS, Ubuntu, ...}/{python2,python3}
    
  • Я использую модули среды, так что когда я ssh в другой компьютер (COMP), псевдонимы Python будут установлены для этого конкретного (COMP). Например:

    1. COMP1 это CentOS

      когда я ssh в COMP1, "python3" должен указывать на $HOME/Centos/python3/bin/python3

    2. COMP2 - это Ubuntu

      когда я ssh в COMP2 "python2" должен указывать на $HOME/Ubuntu/python2/bin/python2


Я могу получить имя ОС в Bash, используя lsb_release -si, но я работаю с модульными файлами, которые написаны на tcl, и не нашли что-то вроде lsb_release, Могу ли я иметь скрипт bash, который выводит lsb_release -si когда вызывается из сценария tcl?

  • Я пытался сделать это, но не повезло:

    BASH SCRIPT:

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

МОДУЛЬФИЛЬНЫЙ СКРИПТ:

#%Modulefile1.0

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

Это мало что делает.

2 ответа

Ваш код в основном не выглядит явно неправильно.

Но следуя [catch {exec ...} output] значение, которое вы ищете, должно быть в output переменная; OS переменная будет иметь код, указывающий, эффективно ли сценарий bash генерирует какой-либо вывод в stderr. Так как вы определенно не заинтересованы в том выводе отладки, который может быть произведен по причинам, не зависящим от вас, вы, вероятно, можете сделать это:

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

Также убедитесь, что ваш bash-скрипт имеет явный exit в конце. Можно также убедиться, что он останавливается правильно. Это поведение по умолчанию, но здесь лучше быть явным, так как это (маленькая) программа.

Вариант 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

Другие вопросы по тегам