tcl:eval和exec混淆点

Chr*_*Bao 2 eval tcl exec

execevalTcl 有点困惑.在以下示例中:

set cmd "mkdir new_folder";
exec $cmd
Run Code Online (Sandbox Code Playgroud)

不能与错误消息一起使用:couldn't execute "mkdir new_folder" no such file or directory. 并且eval有效

set cmd "mkdir new_folder";
eval exec $cmd
Run Code Online (Sandbox Code Playgroud)

我也尝试过这种方式:

set cmd_1 "mkdir";
set cmd_2 "new_folder"
exec $cmd_1 $cmd_2
Run Code Online (Sandbox Code Playgroud)

它也很好用.那是什么原因?

gle*_*man 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
Run Code Online (Sandbox Code Playgroud)

你真正想做的是使用一个列表.然后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
Run Code Online (Sandbox Code Playgroud)