0

我想在变量中捕获命令的标准输出,类似于 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 ]"

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

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

4

1 回答 1

1

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

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

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


您可能应该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该系统上的输出完全匹配。间距并不完全相同,但这对于很多用途来说并不重要。)

于 2020-07-01T15:30:44.350 回答