TCL:EVAL和exec混乱点

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

我在Tcl中execeval有点困惑。在下面的例子:

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

这也是行之有效的。那么,什么原因呢?

tcl exec eval
3个回答
5
投票

当你真的要小心是当你的参数之一包含空格。在这种情况下,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

3
投票

由于它是在你自己的评论已经暗示,该问题是与参数的解读。如果你仍然想在一个字符串,你可以使用扩展操作{*}命令。

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

1
投票

我看到这个帖子是旧的,我只是把我的答案在我的朋友问这个问题。所以成像你只是在bash shell中执行命令,并希望创建一个目录的情况。在这种情况下,你可以运行:

  • mkdir new_folder

但现在成像如果您运行相同的命令如下会发生什么:

  • "mkdir new_folder"

当然,如果将抛出一个错误说:

庆典上:mkdir new_folder:命令未找到

现在,它是与TCL exec命令一样,当你经过的一切,唯一的参数给exec它去同样的方式在bash:

  • EXEC “MKDIR new_filder” #实际上将执行:
  • “MKDIR new_folder”#在bash和hense将抛出一个错误

现在为什么EVAL帮助?只是因为它在TCL评估后删除范围,而你实际执行:EXEC的mkdir new_folder

希望这可以帮助!

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