expect -c
を使用してbashスクリプト内でexpect
を使用していますが、それにパラメーターを渡すにはどうすればよいですか?
これは私が試したものです:
FILE="myFile"
Host="myhostname"
/usr/bin/expect -c $FILE $Host '
set FILE [lindex $argv 0];
set Host [lindex $argv 1];
send_user "$FILE $Host"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$Host:/tmp/
expect "assword:"
send "password\r"
interact'
同じ内容で別の期待スクリプトを作成しますが、次のようにbashで呼び出します。
myScript.expect $FILE $Host
動作しますが、expect -c
オプションを使用して同じことをするにはどうすればよいですか?
更新:
また試しました:
/usr/bin/expect -c '
set FILE [lindex $argv 0];
set Host [lindex $argv 1];
send_user "$FILE $Host"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$Host:/tmp/
expect "assword:"
send "password\r"
interact' $FILE $Host
できません。 expect-5.45.4
のソースコードでは、exp_main_sub.c
の711行目にあります
case 'c': /* command */
exp_cmdlinecmds = TRUE;
rc = Tcl_Eval(interp,optarg);
...
-c
コードを処理します。 $argv
と友達は、-c
evalが850行目以降で完了した後にのみ作成されます
/* collect remaining args and make into argc, argv0, and argv */
sprintf(argc_rep,"%d",argc-optind);
Tcl_SetVar(interp,"argc",argc_rep,0);
expDiagLog("set argc %s\r\n",argc_rep);
...
Tcl_SetVar(interp,"argv",args,0);
そのため、$argv
コードの実行時には、-c
は絶対に存在しません。
1つの回避策は リモートサーバーでローカルのexpectスクリプトを実行しますか? TCLコードを標準入力に渡し、expect
ファイルを読み込む/dev/stdin
を伴います。
$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla
別の回避策は、シェルを投げてすべてをTCLに書き込むことです
#!/usr/bin/env expect
set FILE [lindex $argv 0]
set Host [lindex $argv 1]
...
そしてchmod +x
それを実行します
./whatyoucalledtheabove somefile somehost
expect
呼び出しの上に現在のシェルスクリプトが実行する他のことを含める必要があります...