2010-11-24 10 views
1

기대되는 긴 명령을 전달할 수 있기를 원합니다. 그것은 어쨌든 다중 명령입니다.EXPECT가 이스케이프 된 문자를 명령 문자로 해석하는 방법

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

공지 사항 난에 "\ n"넣어 나는를 처리하고있어 것처럼 ENTER를 시작합니다 : 우선 여기 내 나는 다음과 같은 그래서이 스크립트를 실행 할


#!/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"로 해석하는 방법에 대한 질문은 어떻게됩니까? "\ r"을 "\ n"대신 인수에 넣으려고 시도했지만 작동하지 않습니다.

감사합니다. 나는 간단한 실험을 수행 할 때

답변

3

, 내가 인수에 \n가 줄 바꿈에 내 쉘 (bash는)에 의해 변환되지 않습니다 것을 발견; 그것은 문자 그대로 남아 있습니다. 당신은 다음과 같이 명령 행 인수를 출력 할 puts를 사용하여 자신이 체크 아웃 할 수 있습니다

puts [lindex $argv 0] 

이 문제를 해결 작업 일을 분할하는 약간의 작업이 필요합니다. 아아, Tcl의 split 명령은 이 아니며이 아닌 다중 문자 시퀀스로 분할됩니다 (다른 문자를 한 번에 여러 문자로 분할 함). 그래서 다른 접근 방식이 필요합니다. 그러나 Tcllib는 정확하게 우리가 필요로하는 것입니다 : splitx 명령. 즉, 우리는이 (@의 tensaix2j의 답변에 따라) 수행하십시오 Tcllib 설치와 함께 사용하도록 구성되어 있지 않은 경우에

#!/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 ... 

는 기대, 당신은 또한 (직접 코드에서 splitx에 대한 코드를 snarf 수 있습니다 온라인으로 찾으십시오. here) 내부의 라이센스를 인정하는 한 (표준 Tcl 라이센스 규칙).

+0

우리가 리터럴 백 슬래시 -n과 일치하기를 원하기 때문에 정규 표현식의'{\\ n} '이라는 점에 유의하십시오. 그리고 그것은 Tcl의 구문 분석과 RE 엔진 모두를 넘어 리터럴을 얻기 위해 작성해야하는 백 슬래시 수를 최소화하는 형식입니다 구문 분석 ... –

+0

추가 단계를 수행해 주셔서 감사합니다. – EDJ

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

각 끝 부분에'\ n'을 보내지 않으실 것입니다. –

관련 문제