TCL/Expect - exec - 如何执行带有参数的程序
TCL/Expect - exec - how to execute program with parameters
我正在 tclsh
中尝试使用 TCL 命令 exec
,这是我的结果:
% 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
%
有人可以解释一下如何执行带参数的命令吗?
编辑:
Expanding a list of parameters in Tcl and eval 文章中的以下示例令人大开眼界:
变量 $action
仅扩展为字符串 "piemiddle apple"
AFTER 命令行已拆分为其单独的参数:
% set action {piemiddle apple}
% set $action
can't read "piemiddle apple": no such variable
结果:set
命令"sees"一个参数,相当于:
% set {piemiddle apple}
扩展运算符允许您指定要扩展的变量在命令行被拆分为单独的参数之前:
% set action {piemiddle apple}
% set {*}$action
apple
结果:set
命令"sees"两个参数,等价于:
% 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
作为 ls
命令的示例,您可以执行以下操作:
exec {*}ls -lsa {*}[glob *.cpp]
请看What does {*} do in TCL?
为 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
的使用。
我正在 tclsh
中尝试使用 TCL 命令 exec
,这是我的结果:
% 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
%
有人可以解释一下如何执行带参数的命令吗?
编辑:
Expanding a list of parameters in Tcl and eval 文章中的以下示例令人大开眼界:
变量 $action
仅扩展为字符串 "piemiddle apple"
AFTER 命令行已拆分为其单独的参数:
% set action {piemiddle apple}
% set $action
can't read "piemiddle apple": no such variable
结果:set
命令"sees"一个参数,相当于:
% set {piemiddle apple}
扩展运算符允许您指定要扩展的变量在命令行被拆分为单独的参数之前:
% set action {piemiddle apple}
% set {*}$action
apple
结果:set
命令"sees"两个参数,等价于:
% 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
作为 ls
命令的示例,您可以执行以下操作:
exec {*}ls -lsa {*}[glob *.cpp]
请看What does {*} do in TCL?
为 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
的使用。