我正在尝试使用TCL命令 exec
在 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
%
谁能给我解释一下如何执行有参数的命令?
编辑。
下面的例子 在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
在 最安全 的方式来建立一个命令 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
.