1

我正在尝试使用 tcl 文件制作自定义 MOTD 标头。我已经成功地将命令添加到 /etc/profile 的最后一行

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

我想将它添加到我现有的 MOTD 中,但我不知道在没有管道中断命令的情况下执行多个命令的正确语法。正如您在下面看到的,我已经尝试过:

#!/usr/bin/env tclsh

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


# * Output

puts "$cows"

它输出了 fortune 和 cowsay 很好但是,我似乎无法让 whoami 命令与其他命令一起执行。

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

任何有关如何从 tcl 格式的语法中执行多个命令的帮助将不胜感激,谢谢大家。

4

2 回答 2

4

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

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

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

因此,将两个和两个放在一起$(...)是 is的正确翻译[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给出的答案基本相同。

于 2012-12-27T05:26:05.370 回答
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"
于 2012-12-27T02:44:54.987 回答