2015-02-12 33 views
1

我對Tcl中的execeval有點困惑。在下面的例子:tcl:eval和exec混淆點

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 

它也適用好。 那是什麼原因?

+3

好吧,我想我知道原因。第一個程序失敗了,因爲它將'mkdir new_folder'視爲要調用的程序,因爲它放在單個字符串中;第二個程序工作,因爲'eval'將以下部分連接到命令列表中;第三個工作,因爲我將兩個分離的字符串傳遞給'exec'。 – 2015-02-12 03:18:07

+1

如果您只是在製作目錄,請查看'file mkdir' ... – 2015-02-12 09:59:48

回答

4

如果你真的要小心是當你的參數之一包含空格。在這種情況下,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 
2

由於它已經隱含在您自己的評論中,所以問題在於參數的解釋。如果你仍然想用sinlge字符串命令,你可以使用擴展操作符{*}

set cdm "mkdir new_folder" 
exec {*}$cmd ;# Tcl 8.5 or higher 
eval exec $cmd ;# alternative solution 

這不僅適用於exec命令。一般規則是:如果一個命令接受多個參數,並且說存儲在一個變量params中,則當您調用該命令時,必須擴展參數: cmd {*}$params。 因此,以下這些腳本是equivlent

cmd par1 par2 

set params "para1 par2" 
cmd {*}$params 
+0

噢,謝謝。 {*}也適用於我。這是替代方法,謝謝。 – 2015-02-12 07:39:05

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

希望這有助於您!