2011-07-11 15 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

シェルは1行だけを解析することを覚えておいてください。したがって、$ varを展開すると、空白を含む1つの文字列になります。 '/ usr/bin/ls;という名前の実行可能ファイルがないので、 pwd; pooladm -d; pooladm -e 'は実行できません。

一方、evalのはそうで「PWD」今「のは/ usr/binに/ LS」を取得し、その引数は、それらを再スキャンしている取り、そして。できます。誰かが文字列に「/ RM -rf」を得ることに成功した場合を検討 - それは可能なセキュリティホールを残しているため

evalは少し際どいです。しかし、それは便利なツールです。

1

使用のバッククォートとエコー。あなたの場合

`echo $var` 
+0

これは理想的ではありません。バッククォートは、後で処理するコマンドの出力をキャプチャするためのものです。 $ varのコマンドが標準出力に何かを書き込んだ場合、この解決法はその出力を捕捉し、それを放棄します。 – Kenster

1

このコマンドを実行するためにシェルの別のコピーを呼び出すことができます:

sh -c "$var" 

は、これは必ずしもevalのを使用してより良いではありません。実際の主な違いは、evalが現在のシェルのコンテキストでコマンドを実行し、sh -cが別のシェルインスタンスでコマンドを実行することです。 varに環境変数を設定するか、現在のディレクトリを変更するコマンドが含まれている場合、それらのコマンドが現在のシェルに影響するようにすることができます。

関連する問題