如何从tcl文件中的单个变量执行多个命令

时间:2012-12-27 01:34:00

标签: linux command format tcl

我正在尝试使用tcl文件创建自定义MOTD标头。我已经将命令添加到/ etc / profile

的最后一行了
cowsay -f $(ls /usr/share/cowsay/cows/  | shuf -n1) $(whoami), $(fortune)

我想将它添加到我现有的MOTD中但是我不知道在没有pipe break命令的情况下执行多个命令的正确语法。如您所见,我尝试过:

#!/usr/bin/env tclsh

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


# * Output

puts "$cows"

输出财富和cowsay罚款但是,我似乎无法使用whoami命令执行其他命令。

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

非常感谢有关如何在tcl格式的语法中执行多个命令的任何帮助,非常感谢。

2 个答案:

答案 0 :(得分:4)

iagreen的答案当然是正确的,可能更易于维护,但回答你的问题:如何将$(some command)翻译成tcl:

在bash中,$(...)语法通过在另一个shell中评估它来执行括号捕获的字符串 - 一个新的bash实例,通常称为子shell。

在tcl中,exec命令将其参数作为要在子shell中计算的单词列表来执行。

因此,将$(...)正确翻译为[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给出的答案基本相同。

答案 1 :(得分: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"