Как получить вывод из bashscript, который вы запускаете из сценария tcl <- (скрипт modulefile)
В моем домашнем каталоге у меня есть подкаталоги (CentOS, Ubuntu и т. Д.), Все для определенных узлов, к которым у меня есть доступ.
Каждая ОС будет содержать свою собственную копию программ, одной из которых является Python:
$HOME/{CentOS, Ubuntu, ...}/{python2,python3}
Я использую модули среды, так что когда я
ssh
в другой компьютер (COMP), псевдонимы Python будут установлены для этого конкретного (COMP). Например:COMP1 это CentOS
когда я
ssh
в COMP1, "python3" должен указывать на$HOME/Centos/python3/bin/python3
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