2012-05-16 63 views
0

我想了解eval語句是如何工作的。下面是一個代碼片段,我在看,我不明白:Csh eval語句?

eval '$SOME_DIR/util/dbget.pl \ 
     VARIABLE1 \ 
     VARIABLE2 \ 
     VARIABLE3 \ 
     VARIABLE4 ' 

的報價是這些奇怪的指向左邊的法國尋找的東西(不知道如何讓他們,如果他們需要在csh中)。

反正我的初步想法經過一番研究,eval只是在命令行中的字符串中輸入字符串,這意味着它運行.pl腳本,然後...我不確定它是如何處理這些變量的。這段代碼上面的評論說「得到一些參數」,但我不確定這意味着什麼。

eval'VARIABLE'是否會初始化變量?這似乎是這樣的,因爲在eval之後代碼繼續使用這些變量,就好像它們現在被初始化了一樣(如果語句檢查等)。

我顯然對這種腳本不熟悉,只是跳入一個大型倉庫。謝謝你的幫助。

+0

使用'set -vx'打開shell調試(我認爲這適用於csh)。然後你可以在不同的處理步驟中看到變量的值。祝你好運。 – shellter

+0

反引號位於鍵盤的左上角,正好位於1鍵(通常)旁邊。祝你好運。 – shellter

回答

2

好的,反引號被替換爲它們之間命令的輸出。

eval接受該輸出並執行該輸出,如同鍵入一樣。

在這種情況下,我假設perl打印出一些變量賦值,如set VARIABLE1=value1setenv VARIABLE1 value1。在這種情況下,在上面的eval之後,你應該有$VARIABLE1以後的csh代碼可用。

只要運行沒有eval的.pl腳本(我認爲是Perl)就不會影響csh進程的環境。通過使用eval,您可以授予Perl代碼修改該環境的權限。

這意味着Perl必須知道它的輸出用於csh,btw。在sh/bash中,變量賦值的語法是不同的。

ETA更多試圖澄清:

如果你這樣做:

$SOME_DIR/util/dbget.pl 

你得到了一堆印刷到你的屏幕變量賦值語句。這是沒有用的,並且對shell中的實際變量沒有任何影響。

如果你這樣做:

echo `$SOME_DIR/util/dbget.pl` 

你得到更迂迴的方式相同的結果:不是Perl代碼直接打印到你的屏幕,它的打印成被傳遞到CSH echo表達命令,然後echo是什麼實際打印到屏幕上。這種區別是微妙的,但很重要:反引號控制遠離perl並將其放回到shell的手中。一旦shell捕獲到輸出,它就可以將其存儲在一個變量中,將其寫入一個文件中,或者使用它來做很多其他事情,從而不必重寫Perl代碼進行處理。 Perl仍然只是打印。

如果你這樣做:

eval `$SOME_DIR/util/dbget.pl` 

那麼什麼殼做的是執行的Perl的輸出就好像它是在提示符下鍵入。這非常強大。這也是很危險的,因爲周圍的程序終止執行代碼,編寫該程序的人從未見過。所以你必須相信該代碼的來源(在這種情況下是perl腳本)不會產生任何破壞性(intentinonally或其他)。

+0

back-tics和eval的好解釋。祝你們好運。 – shellter

+0

是的,注意到並編輯了我的評論。稍後將刪除這個;-) – shellter

+0

確定它是有道理的,perl腳本設置變量。但是,在評估VARIABLE1之後究竟有什麼意義呢?這是你必須做什麼才能使其可用於csh代碼?我想這就是你的答案,但我不明白爲什麼。 – JDS

0

和反引號語法都在csh手冊頁中進行了說明。

如果您在Linux系統上,很可能csh確實是tcsh,它是原始的csh C-shell的增強版本。這些特殊功能在csh和tcsh中都是相同的。反引號語法調用所謂的「命令替換」。

引用我的系統上的tcsh手冊頁(有一些小的調整,以避免降價的反引號字符的特殊處理):

命令subsitution

命令替換被包圍的命令所示在[backticks]中。來自這樣的命令的輸出 通常在空白處, 選項卡和換行符中分成單獨的單詞,其中空字被丟棄;此文本然後 替換原始字符串。在雙引號(「),只有 換行符迫使新詞;空格和製表符被保留

在任何情況下,單個最終換行符不會強制一個新詞注意 ,它因此可以爲一個命令替換。以產生僅部分 一個字,即使命令輸出的完整產品線

而且:

EVAL參數...

(與sh(1)中相同)。將參數讀作shell的輸入,並在當前shell的上下文中執行生成的命令。 這通常用於執行作爲 命令或變量替代結果生成的命令,因爲解析發生在這些替換之前。有關使用eval的示例,請參閱tset(1)。