1

予想されるページ 219 の探索:

#!/bin/bash
set kludge { ${1+"$@"}
shift
shift
exec expect -f $0 ${1+"$@"}
}
# rest of script follows

このbashインタープリター内でexpectスクリプトを実行できますが、次のようなコマンドライン引数を渡すこともできます ./scriptname arg1 arg2 arg3が、試し sh -x ./scriptname arg1 arg2 arg3てみるとエラーが発生しました。上記のステートメントを明確にしてください。bash 内にスクリプトを期待することは本当に役に立ちますか?

4

1 に答える 1

1

最初にExpectから見ると、非常に簡単です。このsetコマンドは、2つの引数が与えられると、変数の値を設定します。ここで、変数名はkludgeであり、値は。の間の複数行の文字列{braces}です。Tcl(およびExpect)では、一重引用符がシェルで機能するのと同じように、中括弧が展開(変数置換、コマンド展開など)を抑制することに注意してください。変数kludgeが使用されないと仮定すると、これは完全に無害なステートメントです。

シェルから少しトリッキーです。このコンテキストでのシェルのsetコマンドは、位置パラメータを設定します。このコマンドの後:

$1 = "kludge"
$2 = "{"
$3, $4, ... <= will be the original command line parameters

次に、パラメータの「スタック」shiftをポップ"kludge"および"{"オフして、元の位置パラメータを復元する2つのコマンドがあります。次に、execコマンドはexpectを起動し、現在実行中のシェルプロセスを置き換えます。使用されなかった場合exec、expectが実行され、(おそらく)終了し、シェルは次の行に構文エラーを報告します。}

全体として、これは期待されるプログラムを起動するための非常に賢い方法です。「#残りのスクリプトが続く」の前のすべてを次のように置き換えます

#!/usr/bin/expect -f

または、シェル部分でさらに多くのことが起こっている場合、これを使用します。

#!/bin/bash
do whatever shell initialization required
expect -c << 'END_OF_EXPECT'
# rest of expect script follows
# ...
END_OF_EXPECT

この場合にオプションを渡すには:

expect - "$@" << 'END_OF_EXPECT'
# ...

シングル-は、コマンドがstdinで実行されることを期待していることを示しています。

于 2013-03-04T17:20:52.780 に答える