首页 > 解决方案 > 需要在TCL脚本中结合linux命令

问题描述

我想从 TCL 脚本运行这个 linux 命令:

uname -a | awk '{print $2}'

我怎样才能做到这一点?

标签: shelltclexecexpect

解决方案


在 Tcl 中,您使用exec命令启动子进程和简单管道。(更复杂的管道通常通过open或通过 Expect 扩展来制作。)有两种方法可以让您的代码使用它。

1.转换引号

bourne shell 单引号与 Tcl 中的大括号非常相似。(除了 Tcl 可以轻松嵌套大括号。)这意味着您可以编写:

exec uname -a | awk {{print $2}}

2.委托给shell

有时,很难进行这种转换。幸运的是,你可以让 shell 为你做这件事:

set theScriptlet {uname -a | awk '{print $2}'}
exec bash -c $theScriptlet

3.停止使用awk获取主机名!

但大多数时候,如果你能提供帮助,你可能不应该使用 awk 作为 Tcl 的子进程。毕竟,awk 是一种自己的编程语言。

set unameinfo [exec uname -a]
set host [lindex [regexp -all -inline {\S+} $unameinfo] 1]

虽然您也可以更直接地获取信息:

set host [exec uname -n]
set host [exec hostname]
set host [info hostname]

请注意,在 Mac OS X 的某些配置中,最后一个选项可能会花费惊人的时间(由于网络堆栈中的怪异可能与 IPv6 分辨率有关)。它也不总是产生完全相同的信息。这取决于您实际上将如何处理这些信息……</p>


推荐阅读