我对 Tcl 中的 exec
和 eval
有点困惑。在下面的例子中:
set cmd "mkdir new_folder";
exec $cmd
无法使用错误消息:无法执行“mkdir new_folder”没有这样的文件或目录。
使用 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
关于tcl:eval 和 exec 混淆点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28468367/