2016-08-20 50 views
0

在我的家目錄中,我有子目錄(CentOS,Ubuntu等)全部用於我有權訪問的特定節點。如何檢索您從tcl腳本運行的bash腳本的輸出< - (modulefile腳本)

  • 每個OS將舉行他們的計劃自己的副本,其中一個是Python的:

    $HOME/{CentOS, Ubuntu, ...}/{python2,python3} 
    
  • 我使用環境的模塊,這樣,當我ssh到不同的計算機(COMP),巨蟒將針對該特定(COMP)設置別名。例如:

    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 modulefiles工作。從tcl腳本調用時,我可以使用bash腳本輸出lsb_release -si嗎?

  • 我想這樣做,但沒有運氣:

    bash腳本:

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

MODULEFILE SCRIPT:

#%Modulefile1.0 

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

這並沒有太大的作用。

回答

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 

參考文獻:envplatform

0

您的代碼大多看起來並不明顯錯誤。

但在[catch {exec ...} output]之後,您要查找的值應該在output變量中; OS變量將具有一個代碼,用於有效地指示bash腳本是否將任何輸出生成爲stderr。既然你肯定不感興趣,這可能不便於您控制之下的原因而產生的調試輸出,你也許可以做到這一點:

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

另外,還要確保你的bash腳本擁有在最後一個明確的exit。不妨確保它正確停止。這是默認的行爲,但最好在這裏明確說明,因爲這是一個(小)程序。