我正在尝试使用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格式的语法中执行多个命令的任何帮助,非常感谢。
答案 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"