2010-11-24 25 views
1

長いコマンドを渡すことができます。それは何とか複数のコマンドです。EXPECTがエスケープ文字をコマンド文字に解釈するにはどうすればいいですか?

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile" 

お知らせ私は「\ n」を置く私が処理していたかのように入力を開始する。まず、ここで私は、私は、その後ように、このスクリプトを実行します


#!/usr/bin/expect -f 
set timeout -1 
spawn telnet xxx.xxx.xxx.xxx 
expect "*?username:*" 
send "someusername\r" 
expect "*?assword:*" 
send "somepassword\r" 
# Here's the command I'd like to pass from the command prompt 
set command [lindex $argv 0] 
send "$command\r" 
send "exit\r" 

スクリプトが期待していますコマンドを実行してから次のコマンドに移動します。

";"でコマンドを区切ることができますが、この特定の練習では、 "\ r"で "\ n"を解釈できると期待しています。

send "mkdir /usr/local/dir1\r" 
send "cd /usr/local/dir1\r" 
send "touch testfile\r" 

"\ n"を "\ r"と解釈するにはどのようになるのでしょうか?私は "\ n"の代わりに "\ r"を引数に入れてみましたが、うまくいきません。

ありがとうございます。

答えて

3

私は簡単な実験を行うと、私は引数で\nが改行に私のシェル(bashの)によって変換されていないことがわかります。それはリテラルのままです。あなたはこのように、コマンドライン引数をプリントアウトするputsを使用することによって、自分自身のためにこれをチェックアウトすることができます:

puts [lindex $argv 0] 

この周りの作業は、物事を分割する作業を少し必要です。ああ、Tclのsplitコマンドはではありません。は複数の文字列に分割されています(異なる文字を一度に分割する)ので、別の方法が必要です。しかし、Tcllibは正確に私たちが必要とするものを持っています:splitxコマンド。それによって、我々は(@のtensaix2jの回答に基づいて)次の操作を行います。

#!/usr/bin/expect -f 
package require Expect;     # Good practice to put this explicitly 
package require textutil::split; # Part of Tcllib 

# ... add your stuff here ... 
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] { 
    send "$line\r" 
    # Wait for response and/or prompt? 
} 
# ... add your stuff here ... 

あなたが期待してTcllibがインストールされ、使用されるように構成されていない場合は、あなたも(コードから直接splitxのコードをSNARFすることができますオンラインhere)をご覧ください(標準のTclライセンスルール)。

+0

リテラルのバックスラッシュ-nと一致させたいので、正規表現の '{\\ n}'であることに注意してください。これは、TclのパースとREエンジンの両方のリテラルを得るために書くバックスラッシュの数を最小限にする形式です解析する... –

+0

あなたの応答を詳細に説明するために余分な手順を取ってくれてありがとう:) – EDJ

0
foreach cmd [ split $command \n ] { 
send "$cmd\r\n" 
} 
+0

ほとんどの場合、それぞれの最後に '\ n 'を送信することは望ましくありません。 –

関連する問題