예상 - 명령이 실패하면 상태 코드 1로 종료하는 방법은 무엇입니까?

예상 - 명령이 실패하면 상태 코드 1로 종료하는 방법은 무엇입니까?

내 목표는 SFTP 서버에서 파일 이름을 바꾸는 데 사용하고 이름 바꾸기에 실패하면 상태 코드 1로 예상을 종료하는 것입니다.

내 예상 스크립트는 잘 작동합니다. 이름이 성공적으로 바뀌었습니다.

이름 바꾸기에 실패하면 상태 코드로 종료하는 방법을 알 수 없습니다.

ubuntu@ip-10-0-0-138:~$> cat expect_script.txt
spawn sftp -o "StrictHostKeyChecking no" [email protected]
expect "password:"
send "somesupersecretpassword\n"
expect "sftp>"
send "rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4\n"
expect "sftp>"
send "rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4\n"
expect "sftp>"
send "bye\n"
expect "#"
exit

스크립트를 실행할 때의 출력은 다음과 같습니다.

ubuntu@ip-10-0-0-138:~$> expect -f expect_script.txt
spawn sftp -o StrictHostKeyChecking no [email protected]
[email protected]'s password:
Connected to nginx.localvpc.
sftp> rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
sftp> rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
sftp> bye
bye
ubuntu@ip-10-0-0-138:~$>

이름 바꾸기가 실패할 경우 반환 코드 0으로 종료하기 위해 내가 할 수 있는 방법을 제안할 수 있는 사람이 있습니까?

추가 질문... 예상 스크립트 끝에서 종료하는 올바른 방법은 무엇입니까? 그 중 하나인가요?

exit
close
expect eof

감사해요!

답변1

해당 텍스트를 일치시키고 이에 대해 작업하여 이름 바꾸기 실패를 확인해야 합니다. 이는 추상화될 수 있습니다 proc(TCL에서는 이를 서브루틴 또는 함수라고 부릅니다).

spawn ...
set ret 0
expect "sftp>"
proc sftp_rename {from to} {
    global ret
    send "rename $from $to\n"
    expect {
        -ex "Couldn't" { set ret 42; exp_continue }
        "sftp>"
    }
}
sftp_rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
sftp_rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
send "bye\n"
expect eof
exit $ret

그때쯤이면 연결이 사라질 것으로 expect eof예상하기 때문에 사용하겠습니다 .sftp

답변2

내 매뉴얼 페이지는 다음과 expect같이 말합니다.

exit [-opts] [status]

[...] 상태(지정되지 않은 경우 0)는 Expect의 종료 상태로 반환됩니다.

그래서 당신은 단지 exit 1.


세 가지 옵션은 EOF에 도달하기 위해 expect eof명령이 expect전달될 때까지 기다립니다. expect나중에 스크립트를 계속할 수 있습니다. expect eof이것이 옵션 중 하나일 뿐이거나 리모컨이 연결 끊김을 감지하여 오류로 처리할 수 있는 상황에서 유용합니다. (물론, 대화를 나누는 양측 모두 상대방이 멈출 때까지 기다리면 문제가 발생합니다.)

close다른 프로세스에 대한 연결을 닫으므로 어떤 의미에서는 expect eof. close스크립트를 종료하기 전에 이를 사용하면 exitwill도 암시적으로 사용되기 때문에 많은 작업을 수행하지 않습니다 close.

exit그런 다음 스크립트를 종료하십시오 . 세 가지 중 선택은 수행하려는 작업에 따라 다릅니다. 종료하고 싶다면 그냥 말하고 exit리모콘이 EOF를 처리하도록 하세요.

관련 정보