我如何在 tclsh 中执行命令替换?

How do I perform a command substitution in tclsh?

我想在变量中捕获命令的标准输出,类似于 Bash 中的命令替换:

#!/bin/bash
x="$(date)"
echo $x

我尝试在 tclsh 中做同样的事情,但它没有达到我想要的效果:

#!/bin/tclsh
set x [date]
echo $x

如果我用tclsh myscript.tclsh执行脚本,它会给出一个错误:

invalid command name "date"
    while executing
"date "
    invoked from within
"set x [ date ]"

另一方面,如果我用 tclsh 打开 TCL 交互式 shell,它不会给出错误并且 echo 行打印一个空字符串。

为什么我的程序在有或没有 REPL 的情况下执行脚本时会给出不同的结果?它有一种方法可以捕获 shell 命令的输出并将其存储在变量中,类似于 Bash?

中的命令替换

当不以交互方式使用 Tcl 时,您需要显式使用exec命令来运行一个子进程。

set x [exec date]
# Tcl uses puts instead of echo
puts $x

在交互式使用中,未知命令处理程序猜测这就是您想要的。在某些情况下。请在您的脚本中明确说明!


您可能应该将 运行ning date 子进程替换为对内置 clock 命令的适当调用:

# Get the timestamp in seconds-from-the-epoch
set now [clock seconds]
# Convert it to human-readable form
set x [clock format $now -format "%a %d %b %Y %H:%M:%S %Z"]

(这几乎与本系统上 date 的输出完全匹配。间距不完全相同,但这对很多用途来说无关紧要。)