从命令行获取TCL的版本?

68

我正在寻找一种非常简单明了的方法,可以通过命令行获取机器上安装的TCL版本。对于大多数编程语言而言,通常是这样的:

languagename -v

提供了我想要的信息。但是这似乎不适用于tclsh

TCL FAQ Q.B21建议如下:

echo 'puts $tcl_version;exit 0' | tclsh

但我想知道是否有更简单和跨平台的方法?(我怀疑这在 Microsoft 操作系统上会失败)。

--

编辑:强调一下,我正在寻找可以直接从操作系统命令行执行的东西。一旦你开始使用 tclsh,就可以获得各种各样的信息,但我正在尝试避免这样做以便于自动发现。


7
如果你还想获取次版本号,可以使用 puts [info patchlevel] 替代 puts $tcl_version。此外,你不需要显式地使用 exit 命令 -- Tcl 会在脚本结束后自动退出。 - glenn jackman
1
谢谢Glenn。这很有用。 - Simon Peter Chappell
1
很有趣了解你需要这些信息的原因。有时在Tcl中,您不需要这些信息,因为STUBS可以使任何较新(<12年)的旧Tcl可接受。 - schlenk
1
这是一个非常合理的问题。我在思考自动记录程序语言版本号的可行性,因为它使用了很多不同的语言,如果手动确定版本号会非常耗时。我已经成功地解决了其他语言的问题,但TCL对我来说还是新领域,而且tclsh的使用方式与其他语言有所不同。 - Simon Peter Chappell
tclsh 命令行接口 API 太糟糕了! - Ciro Santilli OurBigBook.com
3个回答

57
这听起来可能过于简单,但如果您创建了一个包含以下命令的脚本文件:
puts $tcl_version

然后运行tclsh sillyscript.tcl,这将在所有平台上执行,假设二进制文件位于PATH中。虽然它并不花哨,也不起眼,甚至不整洁,但据我所知它符合要求。

====

我很好奇,所以我尝试了一下,没有引号:

echo puts $tcl_version;exit 0 | tclsh

在我的Windows电脑上完全可以执行...也许在TCL检测之前进行平台检测是一个选项?


那可能最终成为完成它的最佳方式。我会等待看看是否有其他答案,否则我会接受这个答案。谢谢。 - Simon Peter Chappell
1
不同的平台具有不同的shell元字符,但是使用辅助脚本文件是最简单的。 - Donal Fellows
1
Linux用户,请复制并粘贴以下内容:echo 'puts $tcl_version;exit 0' | tclsh - Ciro Santilli OurBigBook.com
请查看其他答案,使用info patchlevel来获取更完整的信息。 - XavierStuvw
1
在PowerShell中,您不需要使用; exit 0,并且单引号 echo 版本可以正常工作,尽管在CMD中无法正常工作。 - Mark Reed

29

你也可以做到这一点。

bash-3.2$ tclsh
% puts $tcl_version
8.6
% info patchlevel
8.6.0

但我认为最好的方法是通过回声。

echo 'puts [info patchlevel];exit 0' | tclsh
echo 'puts $tcl_version;exit 0' | tclsh

=======

没有加引号的时候,我尝试了一下感觉很奇怪。我使用的是 Mac OS X。


3
如果你没有将$tcl_version放在单引号中,Bash shell 会尝试使用名为tcl_version的Bash shell变量的值来替换$tcl_version。由于tcl_version不存在,替换后将变成一个空字符串,将"puts $tcl_version"变成"puts"。在Bash shell中,单引号的作用与TCL中的花括号{}类似,可以阻止插值。 - Scooter
1
非常有价值的提示是添加info patchlevel调用。例如,在安装gcc时,这将产生差异,因为tcl是“运行GCC测试套件所必需的;请参见测试部分了解详情。Tcl 8.6在RE模式处理方面存在已知回归,导致测试套件的某些部分失败。[...]这个错误已经在8.6.1中得到修复。”版本8.6随Ubuntu 14.04一起发布,但次要版本号很难获得。 - XavierStuvw
以上有误。版本标注的术语是_major.minor.patchlevel_。因此,info patchlevel可以给出版本到补丁级别。我错误地说了次要发布号码很难获得。实际上是补丁级别难以获得。 - XavierStuvw

13

根据您的Shell,可能是:

tclsh <<< 'puts [info patchlevel]'

3
在我看来,“info patchlevel”比“tcl_version”更好,因为它提供了一个更完整的版本标记。 - XavierStuvw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接