我在Tcl中exec
和eval
有点困惑。在下面的例子:
set cmd "mkdir new_folder";
exec $cmd
不与错误信息的工作:couldn't execute "mkdir new_folder" no such file or directory.
与eval
它的工作原理
set cmd "mkdir new_folder";
eval exec $cmd
我也试过这样:
set cmd_1 "mkdir";
set cmd_2 "new_folder"
exec $cmd_1 $cmd_2
这也是行之有效的。那么,什么原因呢?
当你真的要小心是当你的参数之一包含空格。在这种情况下,eval
不知道该怎么做:
% set cmd "mkdir 'dir with spaces'"
mkdir 'dir with spaces'
% eval exec $cmd
% exec ls -l
total 20
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 'dir
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 spaces'
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 with
你真正想要做的是使用列表。则Tcl准确理解独立的要素是
% set cmd [list mkdir "dir with spaces"]
mkdir {dir with spaces}
% exec {*}$cmd
% exec ls -l
total 24
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 'dir
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:53 dir with spaces
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 spaces'
drwxr-xr-x 2 glennj glennj 4096 Feb 12 07:51 with
由于它是在你自己的评论已经暗示,该问题是与参数的解读。如果你仍然想在一个字符串,你可以使用扩展操作{*}
命令。
set cmd "mkdir new_folder"
exec {*}$cmd ;# Tcl 8.5 or higher
eval exec $cmd ;# alternative solution
这不仅涉及到exec
命令。一般的规则是:如果一个命令接受多个PARAMATERS,并说被存储在一个变量params
,当你调用PARAMATERS有命令进行扩展:cmd {*}$params
。因此,以下这些脚本equivlent
cmd param1 param2
和
set params "param1 param2"
cmd {*}$params
我看到这个帖子是旧的,我只是把我的答案在我的朋友问这个问题。所以成像你只是在bash shell中执行命令,并希望创建一个目录的情况。在这种情况下,你可以运行:
mkdir new_folder
但现在成像如果您运行相同的命令如下会发生什么:
"mkdir new_folder"
当然,如果将抛出一个错误说:
庆典上:mkdir new_folder:命令未找到
现在,它是与TCL exec命令一样,当你经过的一切,唯一的参数给exec它去同样的方式在bash:
现在为什么EVAL帮助?只是因为它在TCL评估后删除范围,而你实际执行:EXEC的mkdir new_folder
希望这可以帮助!