2012-12-27 148 views
1

我想使用tcl文件製作一個自定義的MOTD標頭。我已經在添加的命令將/ etc中的最後一行被succuessful/profile中如何從一個tcl文件中的單個變量執行多個命令

cowsay -f $(ls /usr/share/cowsay/cows/ | shuf -n1) $(whoami), $(fortune) 

我想添加到我的現有MOTD這一點,但我不知道正確的語法給exec沒有多個命令管道中斷命令。正如你可以看到下面我曾嘗試:

#!/usr/bin/env tclsh 

# * Variable 
set cows [exec -- /usr/bin/whoami | /usr/games/fortune | cowsay] 


# * Output 

puts "$cows" 

,它輸出的財富和cowsay罰款,但我似乎無法得到whoami命令與其他命令給exec了。

\ ^__^ 
\ (oo)\_______ 
    (__)\  )\/\ 
     ||----w | 
     ||  || 

任何有關如何從tcl格式的語法中執行多個命令的幫助將非常感謝,謝謝你們。

回答

3

你的方法問題是財富忽略標準輸入。

它看起來像你正在建立一個字符串傳遞給cowsay。爲什麼不使用Tcl字符串構建字符串。例如,

#!/usr/bin/env tclsh 

# * Variable 
set cowsParam [exec /usr/bin/whoami] 
append cowsParam ", " [exec /usr/games/fortune] 
set cowImage [exec ls /usr/share/cowsay/cows/ | shuf -n1] 
set cows [exec cowsay -f $cowImage $cowsParam] 


# * Output 

puts "$cows" 
+0

是的,iagreen謝謝你的cowsParam字符串! =),但我認爲真正的問題是獲取:在.tcl文件內工作的cowsay -f $(ls/usr/share/cowsay/cows/| shuf -n1) 。我一直在嘗試這個,但似乎無法執行此 – Oddacon

+0

不是一個問題,只要按照相同的模式。查看上面的編輯。 – iagreen

+0

- = congrats = - 我試圖做$ cowImage $ cowsParam。我試圖弄清楚如何使用ls和| shuf -n1在cowsay內。非常感謝朋友! – Oddacon

4

通過iagreen答案當然是正確的,可能更易於維護,但回答你subquestion:如何$(some command)翻譯成TCL:

在bash中$(...)語法執行捕獲的字符串通過在另一個shell中對其進行評估而得到括號 - 一個bash的新實例通常被稱爲子shell。

在tcl中,exec命令將其參數作爲子列表中要評估的單詞列表執行。

因此,將兩個和兩個放在一起的正確譯文$(...)[exec ...]

因此,這個直接翻譯:

cowsay -f $(ls /usr/share/cowsay/cows/ | shuf -n1) $(whoami), $(fortune) 

是這樣的:

exec cowsay -f [exec ls /usr/share/cowsay/cows/ | shuf -n1] \ 
       [exec whoami], [exec fortune] 

這基本上是一樣的iagreen給出了答案。

相關問題