TCLExpect - exec - 如何执行带参数的程序。

问题描述 投票:4回答:2

我正在尝试使用TCL命令 exectclsh 这是我的结果。

% set show_me_dir "ls"
ls
% exec $show_me_dir
VboxSharedFolder
% set show_me_dir "ls -la"
ls -la
% exec $show_me_dir
couldn't execute "ls -la": no such file or directory
% set show_me_dir {ls -la}
ls -la
% exec $show_me_dir
couldn't execute "ls -la": no such file or directory
% ls -la
total 141
d---------+ 1 wakatana Domain Users     0 Jan 22 19:12 .
d---------+ 1 wakatana Domain Users     0 Apr 16  2014 ..
----------+ 1 wakatana Domain Users 20214 Jan 23 18:43 .bash_history
----------+ 1 wakatana Domain Users  1494 Apr 15  2014 .bash_profile
----------+ 1 wakatana Domain Users  7593 Jan 22 19:03 .bashrc
d---------+ 1 wakatana Domain Users     0 Jan 15 14:56 VboxSharedFolder
%

谁能给我解释一下如何执行有参数的命令?

编辑。

下面的例子 在Tcl和eval中展开一个参数列表。 文章是大开眼界,这里发生了什么。

变量 $action 只扩展为字符串 "piemiddle apple" 命令行已被分割成各个参数。

% set action {piemiddle apple}
% set $action
can't read "piemiddle apple": no such variable

结果: set 命令 "看到 "一个参数,相当于:

% set {piemiddle apple}

扩充操作符允许你指定一个变量要被扩充。之前 命令行被分割成各个参数。

% set action {piemiddle apple}
% set {*}$action
apple

结果: set 命令 "看到 "两个参数, 相当于:

% set piemiddle apple

在Tcl的早期版本中,eval命令是被推荐的替代方案,它至今仍然可用。

% set action {piemiddle apple}
% eval set $action
apple

另一个例子证明了扩展运算符的功能。

% set {*}"name Linus"
Linus
% puts $name
Linus
%
%
% set distro Unbuntu
Unbuntu
% set {*}"linux $distro"
Unbuntu
% puts $linux
Unbuntu
%
%

最后,我们发现 exec 需要命令作为它的第一个参数,第一个命令选项作为它的第二个参数等等。

% exec "ls" "-la"
total 137
d---------+ 1 wakatana Domain Users     0 Jan 22 19:12 .
d---------+ 1 wakatana Domain Users     0 Apr 16  2014 ..
----------+ 1 wakatana Domain Users 20214 Jan 23 18:43 .bash_history
----------+ 1 wakatana Domain Users  1494 Apr 15  2014 .bash_profile
----------+ 1 wakatana Domain Users  7593 Jan 22 19:03 .bashrc
d---------+ 1 wakatana Domain Users     0 Jan 15 14:56 VboxSharedFolder
%
%
% exec "ls -la"
couldn't execute "ls -la": no such file or directory
arguments tcl exec command-line-arguments expect
2个回答
5
投票

最安全 的方式来建立一个命令 exec 是使用Tcl的 list. 比如说。

% set tcl_version
8.5
% set cmd [list ls -l tmp]
ls -l tmp
% eval exec $cmd
total 32
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 file.txt
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-1.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-2.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-3.dat
% exec {*}$cmd
total 32
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 file.txt
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-1.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-2.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-3.dat
%

注意: {*} 是Tcl 8.5的一个新语法,它可以帮助减少使用 eval.


1
投票

例如 ls 命令你可以做。

exec {*}ls -lsa {*}[glob *.cpp]

请看一下 在TCL中,{*}是干什么的?

© www.soinside.com 2019 - 2024. All rights reserved.