2

簡単なexpectスクリプト ( simple.exp) があるとします。

set command "ls -l somedir"
spawn $command
interact

expectこのスクリプトを実行すると、ls -l (スペースを含む文字列全体) が ls をコマンドとして扱い、-l をオプションとして扱うのではなく、コマンドとして扱われるため、エラーが発生します。

expect -f simple.exp
spawn ls -l
couldn't execute "ls -l somedir": no such file or directory
     while executing
"spawn $command"
     (file "simple.exp" line 2)

私が望むのは、bash最初に文字列を処理し、それを個別の引数に分割してコマンドを開始するのと同様の動作です。

bash -c "ls -l somedir"

簡単にするために、変数commandはスクリプトにハードコーディングされていることに注意してください。実際のスクリプトでは、引数 (任意のコマンド ライン文字列) として提供されます。

4

4 に答える 4

3

解決策のヒントは、この質問への回答にあります(言語expectを使用):tcl

set command "ls -l somedir"
spawn {*}$command
interact

この{*}構文は、次の文字列を空白で区切られた単語に分割します。

于 2013-04-06T17:05:01.037 に答える
2

コマンドを作成する最も安全な方法は、Tcllistコマンドを使用することです。例えば:

#!/usr/bin/expect
set cmd [list ls -l "a b c.txt"]
if { [package vcompare $tcl_version 8.5] < 0 } {
    eval spawn -noecho $cmd
} else {
    spawn -noecho {*}$cmd
}
expect eof
于 2013-04-07T04:45:59.183 に答える
0

expect スクリプトの引数として使用される bash 文字列変数がある場合は、lrange を使用してみてください。

set command [lrange $argv x y]

x と y は、文字列変数内の引数の開始と終了です。
例:
文字列変数が

myvariable="hello how are you?"

そして、あなたはそれを次のように使用しています:

./shellscript $myvariable

次に、期待するスクリプト行は次のようになります

set command [lrange $argv 0 3]

$command は、expect スクリプトのどこでも使用できます。必要に応じて空白が含まれます。

于 2014-09-22T07:23:07.347 に答える
0

これは機能します。

#!/usr/bin/expect

set command "ls"
set parameter "-la"
set prompt ":~"
spawn $command $parameter
expect $prompt
于 2013-04-06T07:50:38.440 に答える