我exec和evalTcl 有点困惑.在以下示例中:
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)
它也很好用.那是什么原因?
当你的一个参数包含空格时,你真正需要注意的地方.在那种情况下,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)