0

私はevalステートメントがどのように機能するかを理解しようとしています。これが私が理解していない私が見ているコードの抜粋です:

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

とにかく、いくつかの調査の後の私の最初のアイデアは、evalがコマンドラインでそれらの文字列を文字通り入力するだけであるということです。つまり、.plスクリプトを実行し、その後...これらの変数で何をしているのかわかりません。このコードの上のコメントには「いくつかのパラメーターを取得する」と書かれていますが、それが何を意味するのかわかりません。

eval'VARIABLE'は変数を初期化しますか?これは、評価後、コードがこれらの変数を現在初期化されているかのように使用するためです(ステートメントがチェックする場合など)。

私はこの種のスクリプトに明らかに慣れておらず、大きなリポジトリに飛び込んでいます。助けてくれてありがとう。

4

2 に答える 2

3

わかりました。バックティックは、それらの間のコマンドの出力に置き換えられます。

はそのeval出力を受け取り、入力されたかのように実行します。

この場合、perlはまたはのようないくつかの変数割り当てを出力していると思いset VARIABLE1=value1ますsetenv VARIABLE1 value1。その場合、上記の後で、後でcshコードを使用できるようになりますeval$VARIABLE1

.plスクリプト(私はPerlだと思います)を実行せずに実行するだけevalでは、cshプロセスの環境には影響しません。を使用するevalと、Perlコードにその環境を変更する権限が与えられます。

これは、Perlがその出力がcsh、btwを対象としていることを認識している必要があることを意味します。sh / bashでは、変数代入の構文が異なります。

ETAより多くの説明が試みられました:

これを行う場合:

$SOME_DIR/util/dbget.pl

一連の変数割り当てステートメントが画面に出力されます。これは有用ではなく、シェルの実際の変数には何の影響もありません。

これを行う場合:

echo `$SOME_DIR/util/dbget.pl`

同じ結果がより回りくどい形で得られます。perlコードが画面に直接出力される代わりに、cshechoコマンドに渡される式に出力されecho、実際に画面に出力されます。その区別は微妙ですが重要です。バックティックはperlから制御を奪い、シェルの手に戻します。シェルが出力をキャプチャすると、それを変数に格納したり、ファイルに書き込んだり、Perlコードを書き直す必要がない他の多くのことを実行したりできます。Perlはまだ印刷中です。

これを行う場合:

eval `$SOME_DIR/util/dbget.pl`

次に、シェルが行うことは、プロンプトで入力されたかのようにPerlの出力を実行することです。これは非常に強力です。また、周囲のプログラムが、そのプログラムを作成した人が見たことのないコードを実行してしまうため、危険です。したがって、そのコードのソース(この場合はperlスクリプト)を信頼して、(意図的またはその他の方法で)損傷を与えるものを生成しないようにする必要があります。

于 2012-05-16T17:19:22.027 に答える
0

両方evalとバッククォートの構文は、cshのマニュアルページで説明されています。

Linuxシステムを使用している場合、それcshは実際には、元のCシェルtcshの拡張バージョンである可能性があります。cshこれらの特定の機能は、cshとtcshの両方で同じです。バックティック構文は、「コマンド置換」と呼ばれるものを呼び出します。

私のシステムのtcshのマニュアルページを引用します(マークダウンによるバックティック文字の特別な扱いを避けるために、いくつかの小さな調整を加えました):

コマンドの置換

コマンド置換は、[backticks]で囲まれたコマンドで示されます。このようなコマンドからの出力は、通常、空白、タブ、および改行で別々の単語に分割され、nullの単語は破棄されます。このテキストは、元の文字列を置き換えます。二重引用符( ")内では、改行のみが新しい単語を強制します。空白とタブは保持されます。

いずれにせよ、単一の最後の改行は新しい単語を強制しません。したがって、コマンドが完全な行を出力する場合でも、コマンド置換によって単語の一部のみが生成される可能性があることに注意してください。

と:

evalarg ..。

(sh(1)の場合と同様)引数はシェルへの入力として読み取られ、結果のコマンドは現在のシェルのコンテキストで実行されます。これは通常、コマンドまたは変数の置換の結果として生成されたコマンドを実行するために使用されます。これは、これらの置換の前に解析が行われるためです。evalの使用例については、tset(1)を参照してください。

于 2012-05-16T20:00:33.343 に答える