TCL/Expect - exec - 如何使用参数执行程序

2024-01-12

我正在尝试使用 TCL 命令exec in tclsh这是我的结果:

% 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
%

有人可以解释一下如何使用参数执行命令吗?

Edit:

下面的例子来自扩展 Tcl 和 eval 中的参数列表 http://www.wellho.net/mouth/3583_Expanding-a-list-of-parameters-in-Tcl-and-eval.html文章让我们大开眼界,了解了这里发生的事情:

变量$action仅扩展为字符串"piemiddle apple" AFTER命令行已分为单独的参数:

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

Result: set命令“看到”一个参数,相当于:

% set {piemiddle apple}

扩展运算符允许您指定要扩展的变量BEFORE命令行分为单独的参数:

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

Result: 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

The safest构建命令的方法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
%

注意{*} http://www.tcl.tk/cgi-bin/tct/tip/293是 Tcl 8.5 的新语法,可以帮助减少使用eval.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCL/Expect - exec - 如何使用参数执行程序 的相关文章

随机推荐