2011-07-11 46 views
0

我想要背靠背執行兩個或多個命令。但是這些命令存儲在腳本中的一個變量中。例如,在ksh93中對多個命令執行進行評估,Solaris

var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e" 

當我通過腳本執行這個變量時出現問題。 假設我去:

#!/bin/ksh -p 
.. 
.. 
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e" 
.. 
.. 
$var # DOES NOT WORK ..BUT WORKS WITH EVAL 

它不工作.. 但目前我使用eval:

eval $var 

它出色的作品。

我只是想知道是否有任何其他方式來執行存儲在變量中的一堆命令而不使用eval。

,eval的使用被認爲是一個糟糕的編程實踐,因爲我的編碼標準似乎避開它的使用而不是擁抱它。請讓我知道。

回答

2

請記住,殼只解析行一次。所以當你展開你的$ var時,它會變成一個包含空格的字符串。由於您沒有名爲'/ usr/bin/ls的可執行文件; pwd; pooladm -d; pooladm -e',它不能運行它。另一方面,eval的參數是重新掃描它們,現在你得到'/ usr/bin/ls','pwd'等等。有用。

eval有點僥倖的,因爲它留下了可能的安全漏洞 - 考慮,如果有人設法得到「室射頻/」串入。但它是一個有用的工具。

1

使用反引號和回聲。在你的情況下,

`echo $var` 
+0

這並不理想。反引號旨在捕獲命令的輸出以進行進一步處理。如果$ var中的命令向標準輸出寫入任何內容,則此解決方案將捕獲該輸出並將其丟棄。 – Kenster

1

你可以調用shell的另一個副本運行命令:

sh -c "$var" 

這不一定比使用eval更好。主要的實際區別是EVAL將在當前外殼的上下文中運行的命令,而「SH -c」運行在一個單獨的外殼的實例的命令。如果var包含的命令來設置環境變量或者改變當前目錄,你也可以不希望這些命令影響當前shell。