需要在TCL脚本中组合linux命令

Man*_*dan -3 shell tcl exec expect

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

uname -a | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Don*_*ows 5

在 Tcl 中,您可以使用exec命令启动子进程和简单管道。(更复杂的管道通常是通过openExpect 扩展来创建的。)有两种方法可以让您的代码与之配合使用。

\n\n

1. 转换报价

\n\n

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

\n\n
exec uname -a | awk {{print $2}}\n
Run Code Online (Sandbox Code Playgroud)\n\n

2. 委托给shell

\n\n

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

\n\n
set theScriptlet {uname -a | awk '{print $2}'}\nexec bash -c $theScriptlet\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

但大多数时候,如果可以的话,您可能不应该使用 awk 作为 Tcl 的子进程;毕竟,awk 是一种自己的编程语言。

\n\n
set unameinfo [exec uname -a]\nset host [lindex [regexp -all -inline {\\S+} $unameinfo] 1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
set host [exec uname -n]\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
set host [exec hostname]\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
set host [info hostname]\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,在 Mac OS X 的某些配置中,最后一个选项可能会花费相当长的时间(由于网络堆栈中的怪异现象可能IPv6 分辨率有关)。它也不总是产生相当的信息;这取决于您实际上要如何处理信息\xe2\x80\xa6

\n