리눅스 / 유닉스 명령 기대

Expect는 스크립트에 따라 다른 대화 형 프로그램과 대화하는 프로그램입니다. 스크립트에 이어 Expect는 프로그램에서 기대할 수있는 것과 올바른 응답이 무엇인지 알고 있습니다. 해석 된 언어는 대화 상자를 지시하는 분기 및 상위 제어 구조를 제공합니다. 또한 사용자는 원할 때 제어 및 대화를 직접 취할 수 있으며 이후에 제어를 스크립트로 되돌립니다.

Expectk은 Expect와 Tk가 혼합 된 것입니다. Expect와 Tk의 소원처럼 행동합니다. Expect는 Tcl없이 C 또는 C ++에서 직접 사용할 수도 있습니다.

"Expect"라는 이름은 uucp, kermit 및 기타 모뎀 제어 프로그램에 의해 대중화 된 send / expect 시퀀스의 아이디어에서 비롯됩니다. 그러나 uucp와 달리 Expect는 모든 프로그램과 작업을 염두에두고 사용자 수준 명령으로 실행될 수 있도록 일반화되어 있습니다. Expect는 동시에 여러 프로그램과 대화 할 수 있습니다.

기대할 수있는 것

예를 들어 expect 명령이 수행 할 수있는 몇 가지 작업은 다음과 같습니다.

이 이러한 작업을 수행 할 수없는 다양한 이유가 있습니다. 모두 Expect로 가능합니다.

일반적으로 Expect는 프로그램과 사용자 간의 상호 작용이 필요한 프로그램을 실행하는 데 유용합니다. 필요한 것은 상호 작용이 프로그램 적으로 특성화 될 수 있다는 것입니다. Expect는 제어중인 프로그램을 중단하지 않고 사용자에게 제어 권한을 다시 제공 할 수도 있습니다. 마찬가지로 사용자는 언제든지 스크립트에 제어권을 반환 할 수 있습니다.

용법

Expect는 실행할 명령 목록에 대해 cmdfile을 읽습니다. Expect는 #!를 지원하는 시스템에서 암시 적으로 호출 될 수 있습니다. 스크립트를 실행 파일로 표시하고 스크립트의 첫 번째 줄을 작성하여 표기법을 사용합니다.

#! / usr / local / bin / expect -f

물론, 경로는 Expect가 사는 곳을 정확히 설명해야합니다. / usr / local / bin은 예제 일뿐입니다.

-c 플래그는 스크립트에서 앞에 실행될 명령 앞에 붙습니다. 쉘에 의해 분할되지 않도록 명령을 인용해야합니다. 이 옵션은 여러 번 사용할 수 있습니다. 여러 명령은 세미콜론으로 구분하여 단일 -c로 실행할 수 있습니다. 명령은 나타나는 순서대로 실행됩니다. Expectk을 사용할 때이 옵션은 -command로 지정됩니다.

-d 플래그는 expect 및 상호 작용과 같은 명령의 내부 활동을보고하는 일부 진단 출력을 사용 가능하게합니다. 이 플래그는 Expect 스크립트 시작 부분의 "exp_internal 1"과 동일한 효과를 가지며 Expect 버전이 인쇄됩니다.

-D 플래그는 대화식 디버거를 사용 가능하게합니다. 정수 값이 와야합니다. 디버거는 값이 0이 아니거나 ^ C를 누르거나 중단 점에 도달하거나 다른 적절한 디버거 명령이 스크립트에 나타나는 경우 다음 Tcl 프로 시저보다 먼저 제어를받습니다. Expectk을 사용할 때이 옵션은 - Debug로 지정됩니다.

-f 플래그는 명령을 읽을 파일을 선행합니다. #!를 사용할 때만 유용하기 때문에 플래그 자체는 선택 사항입니다. 표기법을 사용하여 다른 인수를 명령 행에 제공 할 수 있습니다. Expectk을 사용할 때이 옵션은 -file로 지정됩니다.

기본적으로 명령 파일은 메모리 로 읽어지고 전체에서 실행됩니다. 때때로 한 번에 한 행씩 파일을 읽는 것이 바람직합니다. 임의의 파일을이 방식으로 강제 처리하려면 -b 플래그를 사용하십시오. Expectk을 사용할 때이 옵션은 -buffer로 지정됩니다.

"-"문자열이 파일 이름으로 제공되면 표준 입력이 대신 읽혀집니다. "./-"를 사용하여 실제로 "-"라는 파일에서 읽습니다.

-i 플래그는 Expect가 대화식으로 파일에서 명령을 읽는 대신 명령을 프롬프트하도록합니다. 프롬프트는 종료 명령 또는 EOF를 통해 종료됩니다. -i 플래그는 명령 파일이나 -c가 사용되지 않는 것으로 가정됩니다. Expectk을 사용할 때이 옵션은 -interactive로 지정됩니다.

- 옵션의 끝을 구분하는 데 사용할 수 있습니다. 이것은 Expect가 해석하지 않고 옵션과 유사한 인수를 스크립트에 전달하려는 경우에 유용합니다. 이것은 유용하게 #! Expect에 의한 깃발 같은 해석을 막기위한 라인. 예를 들어, 다음 명령은 변수 argv 에 스크립트 이름을 포함하여 원래 인수를 남겨 둡니다.

#! / usr / local / bin / expect -

#! 인수를 추가 할 때 일반적인 getopt (3) 및 execve (2) 규칙을 준수해야합니다. 선.

$ exp_library / expect.rc 파일은 -N 플래그가 사용되지 않는 한 자동으로 소스됩니다. (Expectk을 사용하는 경우이 옵션은 -NORC로 지정됩니다.) -n 플래그가 사용되지 않는 한 바로 다음에 ~ / .expect.rc 파일이 자동으로 소스됩니다. DOTDIR 환경 변수가 정의되면 디렉토리로 취급되고 .expect.rc가 거기에서 읽혀집니다. Expectk을 사용할 때이 옵션은 -norc로 지정됩니다. 이 소싱은 -c 플래그를 실행 한 후에 만 ​​발생합니다.

-v Expect가 버전 번호를 출력하고 종료하도록합니다. 긴 플래그 이름을 사용하는 Expectk의 해당 플래그는 -version입니다.

선택적 args는 목록으로 만들어지고 argv 및 arg라는 변수에 저장됩니다. argc는 argv의 길이로 초기화됩니다.

Argv0은 스크립트가 사용되지 않으면 스크립트 또는 2 진의 이름으로 정의됩니다. 예를 들어, 다음은 스크립트 이름과 처음 세 인수를 출력합니다.

send_user "$ argv0 [lrange $ argv 0 2] \ n"

명령들

Expect는 Tool Command Language를 사용합니다. Tcl은 제어 흐름 (if, for, break), 표현식 평가 및 재귀 및 프로 시저 정의와 같은 여러 가지 기능을 제공합니다. 여기에 사용되었지만 정의되지 않은 명령 (set, if, exec)은 Tcl 명령입니다. Expect는 추가 명령을 지원합니다. 달리 지정하지 않는 한 명령은 빈 문자열을 반환합니다.

명령은 빨리 찾을 수 있도록 사전 순으로 나열됩니다. 그러나 새 사용자는 스폰, 보내기, 예상 및 상호 작용의 설명을 순서대로 읽는 것으로 시작하기가 쉽습니다.

닫기 [-slave] [-onexec 0 | 1] [-i spawn_id]

현재 프로세스에 대한 연결을 닫습니다. 대부분의 대화 형 프로그램은 표준 및 종료시 EOF 를 감지합니다. 따라서 대개 프로세스 를 종료하는 데에도 충분합니다. -i 플래그는 명명 된 spawn_id에 해당하는 프로세스 를 닫을 것을 선언합니다.

기대와 상호 작용 모두 현재 프로세스가 종료되고 암시 적으로 종료 될 때를 감지하지만 "exec kill $ pid"로 프로세스를 종료하면 명시 적으로 close를 호출해야합니다 .

-onexec 플래그는 새로운 생성 된 프로세스에서 스폰 ID가 닫히는 지 또는 프로세스 가 오버레이되는지 여부를 결정합니다. 생성 ID를 열어 두려면 0 값을 사용하십시오. 0이 아닌 정수 값은 새 프로세스에서 생성을 강제로 닫습니다.

-slave 플래그는 spawn id와 연결된 슬레이브를 닫습니다. 연결이 닫히면, 슬레이브는 여전히 열려 있으면 자동으로 닫힙니다.

연결이 암시 적으로 또는 명시 적으로 닫혀 있는지 여부에 관계없이 wait을 호출하여 해당 커널 프로세스 슬롯을 지워야합니다. close 명령은 프로세스 연결을 닫으면 종료 될 것이라는 보장이 없기 때문에 wait를 호출하지 않습니다.

debug [[-now] 0 | 1]

명령문을 단계별로 실행하고 중단 점을 설정할 수있는 Tcl 디버거를 제어합니다.

인수가 없으면 디버거가 실행 중이 아니면 1이 반환되고 그렇지 않으면 0이 반환됩니다.

인수가 1 인 경우 디버거가 시작됩니다. 인수가 0이면 디버거가 중지됩니다. 1 개의 인수 앞에 -now 플래그가 있으면 디버거가 즉시 시작됩니다. 그렇지 않으면 디버거가 다음 Tcl 문으로 시작됩니다.

debug 명령은 트랩을 변경하지 않습니다. 이것을 -D 플래그로 Expect를 시작하는 것과 비교하십시오.

disconnect 명령은 분기 된 프로세스터미널 에서 연결 해제합니다. 백그라운드에서 계속 실행됩니다. 프로세스에 자체 프로세스 그룹이 제공됩니다. 표준 I / O는 / dev / null로 리디렉션됩니다.

다음 단편은 disconnect를 사용하여 백그라운드에서 스크립트를 계속 실행합니다.

if {[fork]! = 0} 종료 연결 해제. . .

다음 스크립트는 암호를 읽고 실행될 때마다 암호를 요구하는 매 시간마다 프로그램을 실행합니다. 스크립트는 암호를 제공하므로 한 번만 입력하면됩니다.

{{fork $!} = 0} {sleep 3600; continue} 스폰 연결 끊기 priv_prog expect 암호 : "$ expect_out을 보내십시오. (send_user" 1, 문자열) \ r ". . . exit}

셸 비동기 프로세스 기능 (&)을 통한 연결 끊기의 장점은 연결 해제 전에 터미널 매개 변수를 저장 한 다음 나중에 새 ptys에 적용 할 수 있다는 것입니다. Expect는 Expect가 제어를받을 때까지 이미 터미널의 연결이 끊어져 있으므로 터미널의 매개 변수를 읽을 기회가 없습니다.

exit [-opts] [상태]

Expect가 종료되거나 그렇지 않으면 그렇게 할 준비를합니다.

-onexit 플래그는 다음 인수가 종료 핸들러로 사용되도록합니다. 인수가 없으면 현재 종료 핸들러가 리턴됩니다.

-noexit 플래그는 Expect 가 종료 준비를하지만 실제로 운영 체제로 제어를 리턴하지 못하는 경우 중지합니다. 사용자 정의 exit 처리기는 Expect 자체 내부 처리기와 마찬가지로 실행됩니다. 더 이상의 Expect 명령을 실행해서는 안됩니다. Expect를 다른 Tcl 확장과 함께 실행하는 경우에 유용합니다. 현재의 인터프리터 (및 Tk 환경의 경우 기본 윈도우)는 다른 Tcl 확장이 정리할 수 있도록 남아 있습니다. Expect의 exit 가 다시 호출되면 (그러나 이것이 발생할 수 있음) 처리기가 다시 실행되지 않습니다.

종료하면 스폰 된 프로세스에 대한 모든 연결이 닫힙니다. 폐쇄는 생성 된 프로세스에 의해 EOF로 탐지됩니다. exit 는 일반적인 _exit (2) 프로 시저가 수행하는 것 이상의 다른 작업을 수행하지 않습니다. 따라서 EOF를 확인하지 않는 생성 된 프로세스는 계속 실행될 수 있습니다. (스폰 된 프로세스가 보내질 신호를 결정하는 데 다양한 조건이 중요하지만, 이는 exit (3) 아래에 일반적으로 문서화되어 있습니다.) 계속 실행되는 생성 된 프로세스는 init에 의해 상속됩니다.

상태 (또는 지정되지 않은 경우 0)가 Expect 의 종료 상태로 리턴됩니다. 스크립트의 끝에 도달하면 exit 가 내재적으로 실행됩니다.

exp_continue [-continue_timer]
exp_continue 명령을 사용하면 예상 대로 정상적으로 돌아가는 대신 실행을 계속할 수 있습니다. 기본적으로 exp_continue 는 제한 시간 타이머를 재설정합니다. -continue_timer 플래그는 타이머가 다시 시작되지 않도록합니다. 자세한 내용은 기대 하십시오.

exp_internal [-f 파일] 값
이 0이 아닌 경우 추가 명령이 Expect 에 내부의 진단 정보를 stderr 로 보냅니다. 이 출력은 이 0이면 사용할 수 없습니다. 진단 정보에는 수신 된 모든 문자와 현재 출력을 패턴과 일치시키려는 모든 시도가 포함됩니다.

선택적 파일 이 제공되면, 모든 일반 및 디버깅 출력이 값의 과 관계없이 해당 파일에 기록됩니다. 이전 진단 출력 파일이 닫힙니다.

-info 플래그는 exp_internal이 주어진 최신 비 정보 인수에 대한 설명을 리턴하도록합니다.

exp_open [args] [-i spawn_id]
원래 스폰 ID에 해당하는 Tcl 파일 식별자를 반환합니다. 파일 식별자는 Tcl의 open 명령으로 열린 것처럼 사용할 수 있습니다. (스폰 ID는 더 이상 사용되지 않아야하며 대기 는 실행되지 않아야합니다.

-leaveopen 플래그는 Expect 명령을 통해 액세스하기 위해 스폰 ID를 열어 둡니다. 대기 는 스폰 ID에서 실행되어야합니다.

exp_pid [-i spawn_id]
현재 생성 된 프로세스에 해당하는 프로세스 ID를 반환합니다. -i 플래그가 사용되면, 반환 된 PID 는 주어진 스폰 ID의 PID와 일치합니다.

exp_send
send 의 별칭입니다.

exp_send_error
send_error 의 별명입니다.

exp_send_log
send_log 의 별명입니다.

exp_send_tty
send_tty 의 별칭입니다.

exp_send_user
send_user 의 별명입니다.

exp_version [[-exit] 버전]
스크립트가 현재 버전의 Expect와 호환되는지 확인하는 데 유용합니다.

인수가 없으면 Expect 의 현재 버전이 반환됩니다. 이 버전은 스크립트에 인코딩 될 수 있습니다. 최신 버전의 기능을 사용하고 있지 않다는 것을 알고 있다면 이전 버전을 지정할 수 있습니다.

버전은 점으로 구분 된 세 개의 숫자로 구성됩니다. 첫 번째는 주요 번호입니다. 다른 주요 번호로 Expect 버전 용으로 작성된 스크립트는 거의 효과가 없을 것입니다. exp_version 은 주 번호가 일치하지 않으면 오류를 반환합니다.

두 번째는 부 번호입니다. 현재 버전보다 큰 부 번호가있는 버전 용으로 작성된 스크립트는 새로운 기능에 따라 달라질 수 있으며 실행되지 않을 수 있습니다. exp_version 은 주 번호가 일치하지만 스크립트 부 번호가 실행중인 기대치 보다 크면 오류를 반환합니다.

세 번째는 버전 비교에서 아무런 역할을하지 않는 숫자입니다. 그러나 Expect 소프트웨어 배포가 추가 문서 나 최적화와 같이 어떤 식 으로든 변경되면 증가합니다. 새 마이너 버전이 나올 때마다 0으로 재설정됩니다.

-exit 플래그를 사용하면 Expect 가 오류를 인쇄하고 버전이 만료 된 경우 종료합니다.

[[-opts] pat1 body1] ... [-opts] patn [bodyn]
패턴 중 하나가 스폰 된 프로세스의 출력과 일치하거나, ​​지정된 시간이 지났거나, 파일 끝 (end-of-file)이 표시 될 때까지 대기합니다. 최종 본문이 비어 있으면 생략 될 수 있습니다.

가장 최근의 expect_before 명령의 패턴은 다른 패턴보다 먼저 암시 적으로 사용됩니다. 가장 최근의 expect_after 명령의 패턴은 다른 패턴 다음에 내재적으로 사용됩니다.

전체 expect 문에 대한 인수에 둘 이상의 행이 필요한 경우 백 슬래시로 각 행을 종료하지 않도록 모든 인수를 하나의 행에 "부"할 수 있습니다. 이 경우, 중괄호에도 불구하고 일반적인 Tcl 대체가 발생합니다.

패턴이 키워드 eof 인 경우 해당 본문은 파일 끝에서 실행됩니다. 패턴이 키워드 시간 초과 인 경우 시간 초과시 해당 본문이 실행됩니다. timeout 키워드를 사용하지 않으면, 시간 초과시 암시 적 널 (null) 조치가 실행됩니다. 기본 제한 시간은 10 초이지만 "set timeout 30"명령을 사용하여 30으로 설정할 수 있습니다. 무한 타임 아웃은 값 -1로 지정 될 수 있습니다. 패턴이 키워드 default 인 경우 시간 초과 또는 파일 끝에서 해당 본문이 실행됩니다.

패턴이 일치하면 해당 본문이 실행됩니다. expect 는 본문의 결과를 반환합니다 (패턴이 일치하지 않으면 빈 문자열). 여러 패턴이 일치하는 경우, 먼저 나타나는 패턴이 본문을 선택하는 데 사용됩니다.

새로운 산출물이 도착할 때마다, 나열된 순서대로 각 패턴과 비교됩니다. 따라서 프롬프트와 같이 마지막 패턴이 표시되도록 보장하여 일치가 없는지 테스트 할 수 있습니다. 프롬프트가없는 상황에서는 시간 초과 를 사용해야합니다 (수동으로 상호 작용하는 경우처럼).

패턴은 세 가지 방법으로 지정됩니다. 기본적으로 패턴은 Tcl의 문자열 일치 명령으로 지정됩니다. (이러한 패턴은 일반적으로 "glob"패턴이라고도하는 C 셸 정규 표현식과 유사합니다.) -gl 플래그는 expect 플래그와 일치하지 않는 패턴을 보호하는 데 사용될 수 있습니다. "-"로 시작하는 패턴은이 f}으로 보호되어야합니다. ( "-"로 시작하는 모든 문자열은 이후 옵션을 위해 예약되어 있습니다.)

예를 들어 다음 조각은 로그인 성공 여부를 찾습니다. ( 중단 은 스크립트의 다른 곳에 정의 된 프로 시저로 간주됩니다.)

기대 {busy {busys \ n; exp_continue} 중단 "잘못된 암호"abort timeout abort connected}

따옴표는 네 번째 패턴에 필요하며, 그렇지 않으면 패턴을 액션과 분리 할 수있는 공백이 있기 때문입니다. 동일한 작업 (예 : 3 및 4)이있는 패턴은 작업을 다시 나열해야합니다. 이것은 regexp-style 패턴을 사용함으로써 피할 수 있습니다 (아래 참조). glob 스타일 패턴 형성에 대한 더 자세한 정보는 Tcl 매뉴얼에서 찾을 수 있습니다.

Regexp 스타일 패턴은 Tcl의 regexp ( "정규 표현식"의 약자) 명령에 의해 정의 된 구문을 따릅니다. regexp 패턴은 -re 플래그와 함께 도입됩니다. 이전 예제는 regexp를 다음과 같이 사용하여 다시 작성할 수 있습니다.

기대 {busy {busys \ n; exp_continue} -re "잘못된 암호가 잘못되었습니다"abort timeout abort connected}

두 유형의 패턴은 모두 "분리되지 않은"패턴입니다. 즉, 패턴은 전체 문자열과 일치 할 필요는 없지만 문자열의 모든 부분이 시작되고 끝날 수 있습니다 (그 밖의 모든 것이 일치하는 한). ^를 사용하여 문자열의 시작 부분과 일치시키고 $를 사용하여 끝 부분과 일치시킵니다. 문자열의 끝을 기다리지 않으면 문자열이 생성 된 프로세스에서 반향됨에 따라 응답이 문자열 중간에 쉽게 끝날 수 있습니다. 여전히 정확한 결과를 산출하는 동안 출력은 부 자연스럽게 보일 수 있습니다. 따라서 문자열 끝에 정확하게 문자를 기술 할 수 있다면 $를 사용하는 것이 좋습니다.

많은 편집자에서 ^와 $는 각각 줄의 시작과 끝과 일치한다는 것을 기억하십시오. 그러나 expect가 줄 중심이 아니기 때문에이 문자는 현재 예상 일치 버퍼에있는 데이터의 시작과 끝 (줄과 반대)과 일치합니다. (또한, "시스템 소화 불량"에 대한 아래주의 사항 참조)

-ex 플래그는 패턴을 "정확한"문자열로 일치시킵니다. *, ^ 등은 해석되지 않습니다 (보통 Tcl 규칙을 준수해야합니다). 정확한 패턴은 항상 고정되어 있습니다.

-nocase 플래그는 출력의 대문자가 마치 소문자 인 것처럼 비교하게합니다. 패턴은 영향을받지 않습니다.

출력을 읽는 동안 2000 바이트 가 넘으면 이전 바이트를 강제로 "잊어 버릴"수 있습니다. 이것은 match_max 함수로 변경 될 수 있습니다. 지나치게 큰 값은 패턴 일치를 느리게 할 수 있습니다. patlistfull_buffer 인 경우 match_max 바이트가 수신되고 다른 패턴이 일치하지 않으면 해당 본문이 실행됩니다. full_buffer 키워드가 사용되었는지 여부에 관계없이 잊어 버린 문자는 expect_out (버퍼)에 기록됩니다.

patlist 가 키워드 null 이고 remove_nulls 명령으로 null이 허용되면 단일 ASCII 0이 일치하면 해당 본문이 실행됩니다. glob 또는 regexp 패턴을 통해 0 바이트를 일치시키는 것은 불가능합니다.

패턴 (또는 eof 또는 full_buffer)을 일치 시키면 일치하는 이전에는 일치하지 않는 출력이 expect_out (버퍼) 변수에 저장됩니다. 최대 9 개의 정규 표현식 부분 일치는 expect_out (1, string) ~ expect_out (9, string) 변수에 저장됩니다. 패턴 앞에 -indices 플래그를 사용하면 10 개의 문자열 중 시작 및 끝 인덱스 ( lrange에 적합한 형식으로)가 expect_out (X, start)expect_out (X, end) 변수에 저장됩니다. 여기서 X는 a입니다. 자릿수는 버퍼의 하위 문자열 위치에 해당합니다. 0은 전체 패턴과 일치하고 glob 패턴과 regexp 패턴에 대해 생성 된 문자열을 나타냅니다. 예를 들어 프로세스가 "abcdefgh \ n"의 결과를 생성 한 경우 다음 결과가 반환됩니다.

기대 "cd"

마치 다음 문장이 실행 된 것과 같습니다 :

set expect_out (0, string) cd 세트 expect_out (버퍼) abcd

출력 버퍼에 "efgh \ n"이 남아 있습니다. 프로세스가 "abbbcabkkkka \ n"출력을 생성 한 경우, 결과는 다음과 같습니다.

기대 -indices -re "b (b *). * (k +)"

마치 다음 문장이 실행 된 것과 같습니다 :

(1, 문자열) 3 expect_out (1, 문자열) 3 세트 expect_out (0, 시작) 1 세트 expect_out (0, 끝) 1 세트 expect_out (0, 끝) 10 세트 expect_out (0, 문자열) bbbcabkkkk 세트 expect_out (2, 시작) 10 세트 expect_out (2, 끝) 10 세트 expect_out (2, string) k 세트 expect_out (버퍼) abbbcabkkkk

및 "a \ n"출력 버퍼에 남아 있습니다. "*"(및 -re ". *") 패턴은 프로세스의 출력을 더 이상 읽지 않고 출력 버퍼를 비 웁니다.

일반적으로 일치하는 출력은 Expect의 내부 버퍼에서 삭제됩니다. -notransfer 플래그를 패턴 접두사로 사용하면이 문제를 방지 할 수 있습니다. 이 플래그는 실험에 특히 유용합니다 (실험 중에는 편의상 "-not"으로 줄여 쓸 수 있습니다).

일치하는 출력 (또는 eof 또는 full_buffer)과 연관된 스폰 ID는 expect_out (spawn_id)에 저장됩니다.

-timeout 플래그는 현재 expect 명령이 timeout 변수 값을 사용하는 대신 시간 초과 값으로 다음 값을 사용하게합니다.

기본적으로 패턴은 현재 프로세스의 결과와 일치하지만 -i 플래그는 명명 된 spawn_id 목록의 출력이 다음 패턴 (다음 -i 까지)과 일치하도록 선언합니다. spawn_id 목록은 공백으로 구분 된 spawn_ids 목록이거나 spawn_ids 목록을 나타내는 변수 여야합니다.

예를 들어, 다음 예제는 현재 프로세스에서 "connected"또는 $ proc2에서 명명 한 spawn_id에서 "busy", "failed"또는 "invalid password"를 기다립니다.

{-i $ proc2 busy {puts busy \ n; exp_continue} -re "잘못된 암호가 잘못되었습니다"abort timeout abort connected}

any_spawn_id 전역 변수의 값은 패턴을 현재 expect 명령의 다른 모든 -i 플래그로 명명 된 spawn_ids와 패턴을 비교하는 데 사용될 수 있습니다. 연관된 패턴이없는 -i 플래그의 spawn_id (즉, 다른 -i 가 바로 뒤에 오는)는 any_spawn_id 와 연관된 동일한 expect 명령의 다른 패턴에서 사용 가능하게됩니다 .

-i 플래그는 전역 변수의 이름을 지정할 수도 있습니다.이 경우 변수는 스폰 ID 목록에 대해 읽혀집니다. 변수는 변경 될 때마다 다시 읽 힙니다. 이는 명령이 실행되는 동안 I / O 소스를 변경하는 방법을 제공합니다. 이런 식으로 제공된 스폰 ID는 "간접적 인"스폰 ID라고합니다.

중단계속 과 같은 작업 제어 구조 (예 : for , proc )가 일반적인 방식으로 작동하도록합니다. exp_continue 명령을 사용하면 예상 대로 정상적으로 돌아가는 대신 실행을 계속할 수 있습니다.

이는 명시 적 루프 또는 반복되는 expect 문을 피할 때 유용합니다. 다음 예제는 rlogin을 자동화하는 단편의 일부입니다. exp_continue 는 rlogin에서 암호를 묻는 프롬프트가 표시되면 두 번째 expect 문 (프롬프트를 다시 찾는)을 작성하지 않아도됩니다.

$ host에 "{stty -echo send_user"비밀번호 (stty -echo send_user) 패스워드를 입력하십시오 : "expect_user -re"(. *) \ n "send_user"\ n "expect"$ expect_out (1, string) \ r "stty 호스트에 대한 연결에 실패했습니다 : $ expect_out (버퍼) "종료} - 호스트에 대한 연결이 실패했습니다. \ n" re $ prompt}

예를 들어, 다음 부분은 사용자가 이미 완전히 자동화 된 상호 작용을 안내하는 데 도움이 될 수 있습니다. 이 경우 터미널은 원시 모드로 전환됩니다. 사용자가 "+"를 누르면 변수가 증가합니다. "p"를 누르면 몇 가지 리턴이 프로세스로 전송되어 어떤 식 으로든이를 찔러 넣을 수 있습니다. "i"는 사용자가 프로세스와 상호 작용하도록하여 스크립트에서 효과적으로 제어권을 훔칩니다. 각각의 경우에 exp_continue 는 현재 작업을 실행 한 후에 현재 패턴 일치를 계속할 수있게합니다.

stty raw -echo expect_after {-i $ user_spawn_id "p"{ "\ r \ r \ r"; exp_continue} "+"{incr foo; exp_continue} "i"{상호 작용; exp_continue} "종료"종료}

기본적으로 exp_continue 는 제한 시간 타이머를 재설정합니다. -continue_timer 플래그로 exp_continue 를 호출하면 타이머가 다시 시작되지 않습니다.

expect_after [expect_args]
expectexpect_after의 패턴이 일치 할 수있는 경우 expect 패턴이 사용 된다는 점을 제외하고 expect_before와 동일하게 작동합니다. 자세한 정보는 expect_before 명령을 참조하십시오.

expect_background [expect_args]
기대 와 같은 인수를 취하지 만 즉시 반환됩니다. 새 입력이 도착할 때마다 패턴이 테스트됩니다. pattern timeoutdefaultexpect_background에 의미가없고 무시됩니다. 그렇지 않으면 expect_background 명령은 expect가하는 것처럼 expect_beforeexpect_after 패턴을 사용합니다.

expect_background 작업을 평가할 때 동일한 스폰 ID에 대한 백그라운드 처리가 차단됩니다. 작업이 완료되면 백그라운드 처리가 차단 해제됩니다. 백그라운드 처리가 차단되는 동안 동일한 스폰 ID에서 (전경) 기대 를 수행 할 수 있습니다.

expect_background 가 차단 해제 된 동안 expect 를 실행할 수 없습니다. 특정 스폰 ID에 대한 expect_background는 동일한 스폰 ID로 새로운 expect_background를 선언하여 삭제됩니다. pattern없이 expect_background 를 선언하면 주어진 스폰 ID가 백그라운드에서 패턴과 일치하는 기능에서 제거됩니다.

expect_before [expect_args]
기대 와 같은 인수를 취하지 만 즉시 반환됩니다. 동일한 스폰 ID를 갖는 가장 최근의 expect_before 로부터의 패턴 - 액션 쌍들은 다음의 기대 명령들에 암시 적으로 추가된다. 패턴이 일치하면 expect 명령 자체에 지정된 것처럼 처리되고 연관된 본문은 expect 명령의 컨텍스트에서 실행됩니다. expect_beforeexpect의 패턴이 일치 있으면 expect_before 패턴이 사용됩니다.

패턴을 지정하지 않으면 모든 패턴에 대해 스폰 ID가 확인되지 않습니다.

-i 플래그로 대체되지 않는 한 expect_before 패턴은 expect_before 명령이 실행 된 시점에 정의 된 스폰 ID와 일치합니다 (패턴이 일치 할 때가 아님).

-info 플래그는 expect_before 가 일치시킬 패턴의 현재 스펙을 리턴하도록합니다. 기본적으로 현재 스폰 ID를보고합니다. 선택적인 spawn id 지정은 그 spawn id에 대한 정보를 제공 할 수 있습니다. 예를 들어

expect_before -info -i $ proc

많아야 하나의 spawn id 명세가 주어질 수있다. 플래그 -indirect는 간접 지정에서만 오는 직접 스폰 ID를 표시하지 않습니다.

스폰 ID 사양 대신 "-all"플래그는 "-info"가 모든 스폰 ID에 대해보고하도록합니다.

-info 플래그의 출력은 expect_before에 대한 인수로 다시 사용될 수 있습니다.

expect_tty [expect_args]
예상과 같지만 / dev / tty에서 문자를 읽습니다 (즉, 사용자의 키 스트로크). 기본적으로 읽기는 조리 모드로 수행됩니다. 따라서, 라인은 그들을보기를 기대 하기 위해 리턴으로 끝나야합니다. 이것은 stty 를 통해 변경 될 수 있습니다 (아래의 stty 명령 참조).

expect_user [expect_args]
예상과 같지만 표준 입력 (즉, 사용자의 키 스트로크)에서 문자를 읽습니다. 기본적으로 읽기는 조리 모드로 수행됩니다. 따라서, 라인은 그들을보기를 기대 하기 위해 리턴으로 끝나야합니다. 이것은 stty 를 통해 변경 될 수 있습니다 (아래의 stty 명령 참조).

포크
새로운 프로세스를 만듭니다. 새로운 프로세스 는 현재 Expect 프로세스 의 정확한 복사본입니다. 성공하면 fork 는 0을 새 (하위) 프로세스 로 리턴하고 하위 프로세스프로세스 ID를 상위 프로세스로 리턴합니다. 실패 할 경우 (스왑 공간, 메모리 등의 자원 부족으로 인해) fork 는 -1을 부모 프로세스에 반환하고 자식 프로세스 가 생성되지 않습니다.

fork 된 프로세스는 원래 프로세스 와 마찬가지로 exit 명령을 통해 종료 됩니다 . 포크 된 프로세스는 로그 파일에 쓸 수 있습니다. 대부분의 프로세스에서 디버깅이나 로깅을 비활성화하지 않으면 결과가 혼란 스러울 수 있습니다.

일부 pty 구현은 여러 독자와 작성자가 잠시라도 혼란 스러울 수 있습니다. 따라서 생성 프로세스를 시작하기 전에 포킹하는 것이 가장 안전합니다.

상호 작용 [string1 body1] ... [stringn [bodyn]]
현재 프로세스 를 사용자에게 제어하여 키 입력을 현재 프로세스 로 보내고 현재 프로세스 의 stdout 및 stderr을 리턴합니다.

문자열 - 본문 쌍을 인수로 지정할 수 있습니다.이 경우 해당 문자열이 입력 될 때 본문이 실행됩니다. 기본적으로 문자열은 현재 프로세스로 보내지지 않습니다. 최종 본문이없는 경우 interpreter 명령이 사용됩니다.

전체 상호 작용 명령문에 대한 인수에 둘 이상의 행이 필요한 경우, 모든 인수는 백 슬래시로 각 행의 종료를 피하기 위해 하나에 "보강"될 수 있습니다. 이 경우, 중괄호에도 불구하고 일반적인 Tcl 대체가 발생합니다.

예를 들어, 다음 명령 실행은 정의 된 다음 문자열 - 본 쌍과 상호 작용합니다. ^ Z를 누르면 Expect 가 일시 중단됩니다. ( -reset 플래그는 터미널 모드를 복원합니다.) ^ A를 누르면 사용자가 "사용자가 A 제어를 입력했습니다"라는 메시지가 표시되고 프로세스 는 ^ A로 전송됩니다. $를 누르면 사용자에게 날짜가 표시됩니다. ^ C를 누르면 Expect가 종료됩니다. "foo"가 입력되면 사용자는 "bar"를 보게됩니다. ~~을 누르면 Expect 인터프리터가 대화식으로 실행됩니다.

set CTRLZ \ 032 interact {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "당신이 입력 한 컨트롤 -A \ n"; $ {send_user "날짜는 [시계 형식 [시계 초]입니다."} \ 003 exit foo {send_user "bar"} ~~}

문자열 - 본문 쌍에서 문자열은 인수로 나열된 순서대로 일치합니다. 부분적으로 일치하는 문자열은 나머지가 오기를 예상하여 현재 프로세스 로 보내지지 않습니다. 문자가 더 이상 일치하지 않을 수 있도록 입력되면 문자열의 일부만이 다른 일치를 시작할 수없는 프로세스 로 전송됩니다. 따라서 부분적으로 일치하는 부분 문자열 인 문자열은 나중에 일치하려고하는 원래 문자열이 실패 할 경우 나중에 일치 할 수 있습니다.

기본적으로 문자열 일치는 와일드 카드 가없는 것과 같습니다. 반대로 expect 명령은 기본적으로 glob 스타일의 패턴을 사용합니다. -ex 플래그는 상호 작용 플래그와 일치 하는 패턴을 보호하는 데 사용됩니다. "-"로 시작하는 패턴은이 f}으로 보호되어야합니다. ( "-"로 시작하는 모든 문자열은 이후 옵션을 위해 예약되어 있습니다.)

-re 플래그는 문자열을 정규 표현식 스타일 패턴으로 해석하도록합니다. 이 경우 일치하는 부분 문자열은 expect_out 변수에 expect가 저장되는 방식과 마찬가지로 interact_out 변수에 저장됩니다. -indices 플래그도 비슷하게 지원됩니다.

패턴 eof 는 파일 끝에서 실행되는 작업을 소개합니다. 별도의 eof 패턴은 -output 플래그 다음에 도 올 수 있습니다.이 경우 출력을 쓰는 동안 eof가 감지되면 일치합니다. 기본 eof 조치는 "return"이므로 상호 작용은 단순히 EOF를 리턴합니다.

패턴 시간 초과 는 시간 초과 (초 단위) 및 지정된 시간 동안 문자를 읽지 않은 후에 실행되는 동작을 나타냅니다. 제한 시간 패턴은 가장 최근에 지정된 프로세스에 적용됩니다. 기본 시간 제한은 없습니다. 특별한 변수 "timeout"( expect 명령에 의해 사용됨)은이 타임 아웃에 영향을 미치지 않습니다.

예를 들어, 다음 명령문을 사용하여 한 시간 동안 아무 것도 입력하지 않았지만 시스템 메시지를 자주받는 사용자를 자동 로그 아웃 할 수 있습니다.

interact -input $ user_spawn_id 시간 초과 3600 return -output \ $ spawn_id

패턴이 키워드 null 이고 remove_nulls 명령을 통해 널 (NULL)이 허용되면 단일 ASCII 0이 일치하면 해당 본문이 실행됩니다. glob 또는 regexp 패턴을 통해 0 바이트를 일치시키는 것은 불가능합니다.

패턴을 플래그 - 작성으로 시작 하면 interact_out (spawn_id) 변수가 패턴 (또는 eof)과 일치하는 spawn_id로 설정됩니다.

중단계속 과 같은 작업 제어 구조 (예 : for , proc )가 일반적인 방식으로 작동하도록합니다. 그러나 inter_return 은 호출자에서 상호 작용 을 일으키기 위해 상호 작용 을 일으키는 반면, return 원인은 상호 작용 을 호출자에게 반환합니다. 예를 들어, "proc foo"가 상호 작용 을 호출 한 후 inter_return 조치를 실행하면 proc foo 가 리턴됩니다. 인터랙티브 인터프리터가 대화 형으로 호출하는 경우 return 을 사용하면 상호 작용이 계속되고 inter_return 을 호출하면 상호 작용이 호출자에게 반환됩니다.

상호 작용 하는 동안 모든 문자가 현재 프로세스 로 전달 될 수 있도록 원시 모드가 사용 됩니다 . 현재 프로세스 가 작업 제어 신호를 수신하지 못하면 정지 신호 (기본적으로 ^ Z)가 전송되면 중지됩니다. 다시 시작하려면 계속 신호를 보내십시오 (예 : "kill -CONT"). 그런 프로세스에 SIGSTOP을 보내고 싶다면 (^ Z에 의해) 먼저 csh를 생성 한 다음 프로그램을 실행하는 것을 고려하십시오. 반면에 SIGSTOP을 Expect 로 보내기를 원한다면 먼저 이스케이프 문자를 사용하여 인터프리터를 호출 한 다음 ^ Z를 누릅니다.

문자열 - 본문 쌍은 인터프리터에 들어가서 대화식으로 명령을 실행하지 않아도되기 때문에 속기로 사용할 수 있습니다. 이전 터미널 모드는 문자열 본문 본문 본문이 실행되는 동안 사용됩니다.

속도면에서 액션은 기본적으로 원시 모드로 실행됩니다. -reset 플래그는 터미널이 상호 작용 이 수행되기 전의 모드로 재설정됩니다 (항상, cooked 모드). 모드가 전환 될 때 입력 된 문자는 손실 될 수 있습니다 (일부 시스템에서는 터미널 드라이버의 불행한 기능 임). -reset 을 사용하는 유일한 이유는 작업이 cooked 모드로 실행되는 경우입니다.

-echo 플래그는 다음 패턴과 일치하는 문자를 각 문자를 읽을 때이를 생성 한 프로세스로 다시 보냅니다. 이것은 사용자가 부분적으로 입력 된 패턴으로부터 피드백을 볼 필요가있을 때 유용 할 수 있습니다.

패턴이 에코되지만 결국 일치하지 않으면 문자가 생성 된 프로세스 로 전송됩니다. 스폰 된 프로세스가 그 다음에 에코하면 사용자가 문자를 두 번 볼 수 있습니다. -echo 는 사용자가 패턴을 완료하지 않을 가능성이있는 상황에서만 적합합니다. 예를 들어 다음은 rftp에서 인용 한 것입니다. recursive-ftp 스크립트는 ~ g, ~ p 또는 ~ l을 입력하여 현재 디렉토리를 재귀 적으로 가져 오거나 입력하거나 나열합니다. 이것은 보통의 ftp 명령과는 너무 멀리 떨어져 있기 때문에 사용자가 실수로 ~을 입력하지 않을 것입니다.이 경우에는 어쨌든 결과를 무시할 것입니다.

상호 작용 {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

-nobuffer 플래그는 문자가 읽힐 때 다음 패턴과 일치하는 문자를 출력 프로세스 로 보냅니다.

이것은 프로그램이 패턴을 에코 백하도록하려는 경우에 유용합니다. 예를 들어, 다음은 사람이 어디에서 전화를 걸고 있는지 모니터링하는 데 사용될 수 있습니다 (Hayes 스타일 모뎀). "atd"가 표시 될 때마다 스크립트는 나머지 행을 기록합니다.

proc lognumber {} {상호 작용 -nobuffer -re "(. *) \ r"return $ log "[시계 형식 [시계 초]] : dialed $ interact_out (1, 문자열)"} interact -nobuffer "atd"lognumber

상호 작용 하는 동안 log_user의 이전 사용은 무시됩니다. 특히, 상호 작용 은 사용자가 맹목적으로 상호 작용하기를 원하지 않는다고 가정하기 때문에 출력을 기록 (표준 출력으로 보냄)하게합니다.

-o 플래그는 다음 키 몸체 쌍이 현재 프로세스 의 출력에 적용되도록합니다. 예를 들어, 텔넷 세션 중에 원하지 않는 문자를 보내는 호스트 를 처리 할 때 유용 할 수 있습니다.

기본적으로 상호 작용 은 사용자가 stdin을 작성하고 Expect 프로세스 자체의 stdout을 읽는 것을 기대 합니다. -u 플래그 ( "user"의 경우)는 사용자가 해당 인수 (스폰 된 ID 여야 함)로 명명 된 프로세스상호 작용 하게합니다.

이렇게하면 두 개의 무관 한 프로세스가 명시 적 루프를 사용하지 않고 함께 조인 될 수 있습니다. 디버깅을 돕기 위해 Expect 진단은 항상 stderr (또는 특정 로깅 및 디버깅 정보에 대해서는 stdout)로 이동합니다. 같은 이유로 인터프리터 명령은 stdin에서 대화식으로 읽습니다.

예를 들어, 다음 단편은 로그인 프로세스를 작성합니다. 그런 다음 사용자 (도시되지 않음)에게 전화를 걸고 마지막으로 두 사용자를 연결합니다. 물론 모든 프로세스 가 로그인으로 대체 될 수 있습니다. 예를 들어 쉘을 사용하면 사용자가 계정과 암호를 제공하지 않고도 작업 할 수 있습니다.

spawn login set login $ spawn_id spawn 팁 모뎀 # 사용자에게 다시 전화 걸기 # 사용자를 login에 연결 interact -u $ login

출력을 여러 프로세스로 보내려면 -output 플래그가 앞에 나오는 각 스폰 ID 목록을 나열하십시오. 출력 스폰 ID들의 그룹 에 대한 입력은 -input 플래그에 의해 시작되는 스폰 ID리스트에 의해 결정될 수있다. ( -input-outputexpect 명령의 -i 플래그와 같은 형식으로 목록을 취할 수 있습니다. 단, any_spawn_id는 상호 작용 에서 의미가 없습니다.) 다음의 모든 플래그와 문자열 (또는 패턴)은 다른 것까지이 입력에 적용됩니다. 입력 플래그가 나타납니다. -input 이 없으면 -output은 "-input $ user_spawn_id -output"을 의미합니다. (마찬가지로, -input 을 가지지 않는 패턴을 사용 합니다 .) 하나의 -input 이 지정되면 $ user_spawn_id가 무시됩니다. 두 번째 입력이 지정되면 $ spawn_id가 무시됩니다. 추가 입력 플래그가 지정 될 수 있습니다.

두 개의 묵시적인 입력 프로세스는 기본적으로 출력을 $ spawn_id 및 $ user_spawn_id (역순으로)로 지정합니다. -output 플래그없이 no- input 플래그가 나타나면 해당 프로세스의 문자는 버려집니다.

-i 플래그는 다른 -input 또는 -output 플래그가 사용되지 않을 때 현재 spawn_id를 대체합니다. -i 플래그는 -o 플래그를 의미합니다.

간접 스폰 AN 드를 사용하여 상호 작용중인 프로세스를 변경할 수 있습니다. 간접 스폰 APP id는 -i, -u, -input 또는 -output 플래그로 지정할 수 있습니다.

통역사 [args]
Expect 및 Tcl 명령에 대한 대화식 프롬프트가 사용자에게 표시됩니다. 각 명령의 결과가 인쇄됩니다.

중단계속 과 같은 작업 제어 구조 (예 : for , proc )가 일반적인 방식으로 작동하도록합니다. 그러나 return 은 인터프리터가 호출자에게 돌아가도록하며, inter_return인터프리터하여금 호출자에서 return을 발생시킵니다. 예를 들어 "proc foo"가 인터프리터 를 호출하여 inter_return 작업을 실행하면 proc foo 가 반환됩니다. 다른 명령은 해석기 가 새 명령을 계속 프롬프트하도록합니다.

기본적으로 프롬프트에는 두 개의 정수가 포함됩니다. 첫 번째 정수는 평가 스택의 깊이를 나타냅니다 (즉, Tcl_Eval이 몇 번 호출되었는지). 두 번째 정수는 Tcl 히스토리 식별자입니다. 프롬프트는 다음 프롬프트가되는 "prompt1"이라는 프로 시저를 정의하여 설정할 수 있습니다. 문장에 열린 따옴표, 괄호, 중괄호 또는 대괄호가있는 경우, 2 차 프롬프트 (기본적으로 "+>")가 개행시 발행됩니다. 2 차 프롬프트는 "prompt2"라는 프로 시저를 정의하여 설정할 수 있습니다.

인터프리터 중에는 호출자가 원시 모드를 사용 중이라도 조리 된 모드가 사용됩니다.

stdin이 닫히면 -eof 플래그가 사용되지 않는 한 인터프리터 가 리턴합니다.이 경우 후속 인수가 호출됩니다.

log_file [args] [[-a] file]
파일 이름이 제공되면 log_file 은 파일의 해당 지점에서 시작하는 세션의 사본을 기록합니다. 인수가 주어지지 않으면 log_file 은 기록을 중지합니다. 이전 로그 파일이 닫힙니다.

파일 이름 대신 -open 또는 -leaveopen 플래그를 사용하여 Tcl 파일 식별자를 제공 할 수 있습니다. 이는 spawn 명령과 유사합니다. 자세한 정보는 스폰 정보를 참조하십시오.

-a 플래그는 log_user 명령에 의해 표시되지 않도록 출력을 기록하도록합니다.

기본적으로 log_file 명령은 한 세션에서 여러 번 로그 오프 할 수있는 편의를 위해 이전 파일을 자르지 않고 추가 합니다. 파일을 자르려면 -noappend 플래그를 사용하십시오.

-info 플래그는 log_file이 주어진 최신 비 정보 인수의 설명을 리턴하도록합니다.

log_user -info | 0 | 1
기본적으로 send / expect 대화 상자는 stdout (및 열려있는 경우 로그 파일)에 기록됩니다. stdout에 대한 로깅은 "log_user 0"명령으로 비활성화되고 "log_user 1"에 의해 다시 활성화됩니다. 로그 파일로 로깅은 변경되지 않습니다.

-info 플래그는 log_user가 주어진 가장 최근의 비 정보 인수에 대한 설명을 리턴하도록합니다.

match_max [-d] [-i spawn_id] [크기]
expect에 의해 내부적으로 사용되는 버퍼의 크기 (바이트 단위)를 정의합니다. size 인수가 없으면 현재 크기가 반환됩니다.

-d 플래그를 사용하면 기본 크기가 설정됩니다. 초기 기본값은 2000입니다. -i 플래그를 사용하면 명명 된 spawn id에 대해 크기가 설정되고, 그렇지 않으면 현재 프로세스에 대해 설정 됩니다 .

overlay [- # spawn_id] [- # spawn_id] [...] 프로그램 [args]
현재 Expect 프로그램 대신 "program args"를 실행합니다.이 프로그램은 종료됩니다. 벌거 벗겨진 하이픈 인수는 마치 로그인 쉘인 것처럼 명령 이름 앞에 하이픈을 표시합니다. 모든 spawn_ids는 인수로 명명 된 것을 제외하고는 닫힙니다. 이들은 명명 된 파일 식별자에 매핑됩니다.

Spawn_ids는 새 프로그램이 상속 할 파일 식별자에 매핑됩니다. 예를 들어, 다음 행은 체스를 실행하고 현재 프로세스 ( 예 : 체스 마스터)에 의해 제어되도록 허용합니다.

오버레이 -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id 체스

이것은 "interact -u"보다 더 효율적이지만 Expect 프로세스 가 더 이상 제어 할 수 없으므로 프로그램 된 상호 작용을 수행하는 기능을 희생합니다.

제어 단자는 제공되지 않습니다. 따라서 표준 입력을 연결 해제하거나 다시 매핑하면 작업 제어 (쉘, 로그인 등)를하는 프로그램이 제대로 작동하지 않습니다.

패리티 [-d] [-i spawn_id] [값]
패리티가 생성 된 프로세스의 출력에서 ​​유지되거나 제거되어야하는지 여부를 정의합니다. 이 0이면 패리티가 제거되고, 그렇지 않으면 제거되지 않습니다. 인수가 없으면 현재 값이 리턴됩니다.

-d 플래그를 사용하면 기본 패리티 값이 설정됩니다. (초기 기본값은 1입니다. 즉, 패리티는 제거되지 않습니다.) -i 플래그를 사용하면 이름이 지정된 spawn id에 패리티 값이 설정되고 그렇지 않으면 현재 프로세스에 대해 설정 됩니다 .

remove_nulls [-d] [-i spawn_id] [value]
expect_out 또는 interact_out 변수에 패턴 매칭 또는 저장하기 전에 생성 된 프로세스의 출력에서 ​​null이 유지되거나 제거되는지 여부를 정의합니다. 이 1이면 null이 제거됩니다. value 가 0이면 null이 제거되지 않습니다. 인수가 없으면 현재 값이 리턴됩니다.

-d 플래그를 사용하면 기본값이 설정됩니다. 초기 기본값은 1입니다 (즉, 널 (null)이 제거됩니다.) -i 플래그를 사용하면 지정된 spawn id에 대해 값이 설정되고, 그렇지 않으면 현재 프로세스에 대해 설정 됩니다 .

null이 제거되는지 여부에 관계없이 Expect 는 null 바이트를 로그와 stdout에 기록합니다.

send [- 플래그] 문자열
문자열 을 현재 프로세스로 보냅니다. 예를 들어, 명령

"hello world \ r"을 보내십시오.

helloworld 문자를 현재 프로세스 로 보냅니다. (Tcl은 임의로 복잡한 문자열을 만들 수있는 printf 와 같은 명령 ( format )을 포함합니다.)

라인 버퍼 된 입력을 가진 프로그램은 리턴 문자가 전송 될 때까지 문자를 읽지 않지만 문자는 즉시 전송됩니다. 리턴.자는 "\ r"로 표시됩니다.

- 플래그는 다음 인수가 플래그가 아닌 문자열로 해석되도록합니다. 어떤 문자열이라도 실제로는 플래그처럼 보일지라도 "-"앞에 붙을 수 있습니다. 이것은 우연히 플래그처럼 보이지 않는 변수 문자열을 지정하는 신뢰할 수있는 메커니즘을 제공합니다. ( "-"로 시작하는 모든 문자열은 이후 옵션을 위해 예약되어 있습니다.)

-i 플래그는 문자열이 명명 된 spawn_id로 전송되도록 선언합니다. spawn_id가 user_spawn_id 이고 터미널이 원시 모드 인 경우 문자열의 줄 바꿈 문자는 줄 바꾸기 - 줄 바꿈 시퀀스로 변환되어 터미널이 조리 된 모드 인 것처럼 나타납니다. -raw 플래그는이 변환을 사용 불가능하게합니다.

-null 플래그는 널 문자 (0 바이트)를 보냅니다. 기본적으로 하나의 null이 전송됩니다. 전송할 널 (null) 수를 나타 내기 위해 정수 뒤에 -null 수 있습니다.

-break 플래그는 중단 조건을 생성합니다. 이것은 스폰 ID가 "spawn -open"을 통해 열린 tty 장치를 참조하는 경우에만 의미가 있습니다. 팁과 같은 프로세스 를 생성 한 경우 팁 생성 규칙을 사용하여 휴식을 취해야합니다.

-s 플래그를 사용하면 출력이 "느리게"전송되므로 컴퓨터가 동일한 버퍼를 outtype하지 않는 사람을 위해 설계된 입력 버퍼를 outtypes하는 일반적인 상황을 피할 수 있습니다. 이 출력은 두 요소 목록을 취하는 변수 "send_slow"의 값에 의해 제어됩니다. 첫 번째 요소는 원자 적으로 보낼 바이트 수를 나타내는 정수입니다. 두 번째 요소는 원자 송신이 분리되어야하는 초 수를 설명하는 실수입니다. 예를 들어 "send_slow {10 .001}"을 설정하면 보낸 "10 자 사이에 1 밀리 초 문자열을 보내도록"send -s "가 강제 실행됩니다.

-h 플래그는 사람이 실제로 입력하는 것처럼 출력이 보내지도록합니다 (다소). 문자들 사이에는 인간과 유사한 지연이 나타납니다. (이 알고리즘은와 이블 분포를 기반으로하며이 특정 애플리케이션에 맞게 수정되었습니다.)이 출력은 5 개의 요소 목록을 사용하는 "send_human"변수 값에 의해 제어됩니다. 처음 두 요소는 문자의 중간 도착 시간 (초)입니다. 첫 번째는 기본적으로 사용됩니다. 두 번째 단어는 종종 단어 전환점에서 발생하는 미묘한 일시 중지를 시뮬레이트하기 위해 단어 끝에서 사용됩니다. 세 번째 매개 변수는 .1 변수가 상당히 가변적이고 1이 적당히 가변적이며 10은 변함이없는 변수의 척도입니다. 극단은 0에서 무한대까지입니다. 마지막 두 매개 변수는 각각 최소 및 최대 왕복 시간입니다. 최소값과 최대 값이 마지막으로 사용되며 마지막 시간은 "클립"입니다. 최소값과 최대 값으로 충분한 값을 설정하면 궁극적 인 평균값과 주어진 평균값이 상당히 다를 수 있습니다.

예를 들어, 다음 명령은 빠르고 일관적인 타이피스트를 에뮬레이션합니다.

set send_human {.1 .3 1 .05 2} send -h "배고프다. 점심 먹자."

숙취 후에는 다음과 같은 것이 더 적합 할 수 있습니다.

set send_human {.4 .4 .2 .5 100} send -h "굿나잇 파티 밤!"

send 인수에 실수와 수정 사항을 포함 시켜서 오류 정정 상황을 스스로 설정할 수 있지만 오류는 시뮬레이션되지 않습니다.

널 문자 전송, 중단 전송, 느린 출력 강제 및 휴먼 스타일 출력의 플래그는 함께 사용할 수 없습니다. 마지막에 지정된 것만 사용됩니다. 또한, 널 (null). 자 또는 구분을 송신하기위한 플래그와 함 2 문자열 인수를 지정할 수 없습니다.

첫 번째 보내기예상대로 프로세스 에 선행하는 것이 좋습니다. 기대프로세스 가 시작될 때까지 기다릴 것이고, 보낼 수는 없을 것입니다. 특히 프로세스 가 실행되기 전에 첫 번째 전송이 완료되면 데이터를 무시할 위험이 있습니다. 대화식 프로그램에서 초기 프롬프트를 제공하지 않는 상황에서는 다음과 같이 지연 시간을 보내기 전에 보낼 수 있습니다.

# 침입하는 방법에 대한 해커의 힌트를 피하기 위해, #이 시스템은 외부 암호를 요구하지 않습니다. # exec가 spawn telnet을 완료 할 때까지 5 초 동안 기다리십시오. very.secure.gov sleep 5 send password \ r

exp_sendsend 의 별명입니다 . Tk 환경에서 Expectk 또는 Expect의 다른 변형을 사용하는 경우 send 는 완전히 다른 목적으로 Tk에 의해 정의됩니다. exp_send 는 환경 간의 호환성을 위해 제공됩니다. 다른 Expect의 다른 send 명령에도 유사한 별명이 제공됩니다.

send_error [-flags] 문자열
출력이 현재 프로세스가 아니라 stderr로 보내지는 것을 제외하고는 send 와 같습니다.

send_log [-] 문자열
문자열이 로그 파일에만 전송된다는 점을 제외하고는 send 와 같습니다 ( log_file 참조). 로그 파일이 열려 있지 않으면 인수가 무시됩니다.

send_tty [-flags] 문자열
출력이 현재 프로세스가 아닌 / dev / tty로 보내진다는 점을 제외하면 send 와 같습니다.

send_user [-flags] 문자열
출력이 현재 프로세스가 아니라 stdout으로 보내지는 것을 제외하고는 send 와 같습니다.

수면 초
주어진 초 수 동안 스크립트를 잠자기 상태 로 만듭니다. 초는 10 진수 일 수 있습니다. Expect가 사용하는 동안 인터럽트 (및 Expectk을 사용하는 경우 Tk 이벤트)는 처리됩니다.

spawn [args] 프로그램 [args]
"program args"를 실행하는 새로운 프로세스를 생성합니다. stdin, stdout 및 stderr은 Expect에 연결되므로 다른 Expect 명령으로 읽고 쓸 수 있습니다. 닫기프로세스 자체가 파일 식별자를 닫으면 연결이 끊어집니다.

프로세스spawn 에 의해 시작되면 변수 spawn_id 는 해당 프로세스 를 나타내는 디스크립터로 설정됩니다. spawn_id 가 설명하는 프로세스"현재 프로세스 "로 간주됩니다. 사실상 spawn_id 는 읽기 또는 쓰기가 가능하므로 작업 제어가 가능합니다.

user_spawn_id 는 사용자를 참조하는 설명자를 포함하는 전역 변수입니다. 예를 들어, spawn_id 가이 값으로 설정된 경우 expectexpect_user 처럼 작동 합니다.

.I error_spawn_id 는 표준 오류를 참조하는 설명자를 포함하는 전역 변수입니다. 예를 들어, spawn_id 가이 값으로 설정되면 sendsend_error 와 같이 작동 합니다.

tty_spawn_id 는 / dev / tty를 참조하는 디스크립터를 포함하는 전역 변수입니다. / dev / tty가 없으면 (예 : cron, at 또는 batch 스크립트에서) tty_spawn_id 가 정의되지 않습니다. 이것은 다음과 같이 테스트 될 수 있습니다 :

if {info vars tty_spawn_id}} {# / dev / tty가 있음} else {# / dev / tty가 존재하지 않습니다 # 아마 cron, batch 또는 script}

spawn 은 UNIX 프로세스 ID를 반환합니다. 스폰 된 프로세스 가 없으면 0이 반환됩니다. 변수 spawn_out (slave, name) 은 pty 슬레이브 장치의 이름으로 설정됩니다.

기본적으로 스폰는 명령 이름과 인수를 에코합니다. -noecho 플래그는 생성 을 중지 합니다 .

-console 플래그를 사용하면 콘솔 출력이 생성 된 프로세스 로 재 지정됩니다. 일부 시스템에서는 지원되지 않습니다.

내부적으로 spawn 은 pty를 사용하며 사용자 tty와 같은 방식으로 초기화됩니다. 이것은 모든 설정이 "sane"(stty (1)에 따라)되도록 더 초기화됩니다. 변수 stty_init 가 정의되면 stty 인수 스타일로 해석됩니다. 예를 들어, "set stty_init raw"는 추가로 생성 된 프로세스의 터미널을 원시 모드로 시작하게합니다. -nottycopy 는 사용자의 tty에 따라 초기화를 건너 뜁니다. -nottyinit 는 "sane"초기화를 건너 뜁니다.

일반적으로 spawn 은 실행하는 데 약간의 시간이 걸립니다. 상당한 시간이 소요되는 스폰가 발견되면 아마도 쐐기 모양의 ptys가 발생했을 것입니다. 많은 프로세스가 잘못된 프로세스와의 얽힘을 피하기 위해 ptys에서 실행됩니다. (이것들은 쐐기 모양의 pty 당 10 초가 걸립니다.) Expect 가 홀수 상태에서 많은 ptys를 만나면 -d 옵션으로 Expect를 실행합니다. 이러한 pty가 연결된 프로세스를 종료 할 수 없으면 재부팅해야합니다.

exec (2)가 실패 (예 : 프로그램 이없는 경우)하여 프로그램을 성공적으로 생성 할 수없는 경우 프로그램 이 실행되어 오류 메시지가 출력 된 것처럼 다음 상호 작용 또는 예상 명령에 의해 오류 메시지가 반환됩니다. 이 동작은 스폰 의 구현의 자연스러운 결과입니다. 내부적으로 포크를 생성하면 spawn 된 프로세스 는 spawn_id를 통한 통신을 제외하고는 원래의 Expect 프로세스 와 통신 할 수 없습니다.

-open 플래그는 다음 인수가 Tcl 파일 식별자 (즉, open에 의해 반환 됨)로 해석되도록합니다. 스폰 ID는 스폰 된 프로세스 인 것처럼 사용할 수 있습니다. (파일 식별자는 더 이상 사용되지 않아야합니다.) 이렇게하면 pty를 사용하지 않고 원시 장치, 파일 및 파이프 라인을 생성 된 프로세스로 처리 할 수 ​​있습니다. 연관된 프로세스 가 없음을 나타 내기 위해 0이 리턴됩니다. 스폰 된 프로세스에 대한 연결이 닫히면 Tcl 파일 식별자도 닫힙니다. -leaveopen 플래그는 -open 과 유사하지만, -leaveopen을 사용 하면 스폰 ID가 닫힌 후에도 파일 식별자가 열려있게됩니다.

-pty 플래그는 pty가 열리지 만 프로세스 는 생성되지 않습니다. 연관된 프로세스 가 없음을 나타 내기 위해 0이 리턴됩니다. 평소와 같이 Spawn_id가 설정됩니다.

변수 spawn_out (slave, fd) 는 pty 슬레이브에 해당하는 파일 식별자로 설정됩니다. "close -slave"를 사용하여 닫을 수 있습니다.

-ignore 플래그는 생성 된 프로세스 에서 무시할 신호의 이름을 지정합니다. 그렇지 않으면 신호가 기본 동작을 얻습니다. 신호는 각 신호가 별도의 플래그를 필요로한다는 점을 제외하고는 trap 명령에서와 같이 명명됩니다.

strace 레벨
실행되기 전에 다음 명령문을 인쇄합니다. (Tcl의 trace 명령은 변수를 추적합니다.) level 은 추적 할 호출 스택의 길이를 나타냅니다. 예를 들어, 다음 명령은 처음 네 레벨의 호출을 추적하는 동안 Expect 를 실행하지만 그 이하는 호출하지 않습니다.

-c "strace 4"script.exp를 기대하십시오.

-info 플래그는 strace가 주어진 가장 최근의 비 정보 인수에 대한 설명을 리턴하도록합니다.

stty args
외부 stty 명령과 유사하게 터 L 널 모드를 변경합니다.

기본적으로 제어 터미널에 액세스합니다. 다른 터미널은 "명령에 대한 요청"을 추가하여 액세스 할 수 있습니다. 상태가 요청되지 않고 제어 터미널에 액세스하면 원시 및 반향 속성의 이전 상태는 나중에 나타날 수있는 형식으로 반환됩니다 명령에 의해 사용됩니다.

예를 들어, raw 또는 -cooked 인수는 터미널을 원시 모드로 전환합니다. 인수 -raw 또는 cooked 는 터미널을 cooked 모드로 만듭니다. echo-echo 인자는 터미널을 각각 echo와 noecho 모드로 만든다.

다음 예제에서는 에코를 일시적으로 사용하지 않도록 설정하는 방법을 보여줍니다. 이 기능은 자동 스크립트를 사용하여 암호를 포함하지 않도록 할 수 있습니다. (이에 대한 자세한 내용은 아래의 예상 힌트를 참조하십시오.)

stty -echo send_user "암호 :"expect_user -re "(. *) \ n"set password $ expect_out (1, string) stty echo

시스템 인자
는 터미널에서 명령으로 입력 된 것처럼 입력으로 sh (1)에 args 를 제공합니다. Expect 는 쉘이 종료 될 때까지 대기합니다. sh의 반환 상태는 exec 가 반환 상태를 처리하는 것과 같은 방식으로 처리됩니다.

stdin 및 stdout을 스크립트로 리디렉션하는 exec 와 달리 시스템 은 리디렉션을 수행하지 않습니다 (문자열 자체가 나타내는 것 이외의). 따라서 / dev / tty와 직접 대화해야하는 프로그램을 사용할 수 있습니다. 같은 이유로 시스템 의 결과는 로그에 기록되지 않습니다.

타임 스탬프 [args]
타임 스탬프를 반환합니다. 인수가없는 경우 에포크가 반환 된 이후의 시간 (초)이 반환됩니다.

-format 플래그는 반환되지만 strftime에 대한 POSIX 규칙에 따라 대체 된 문자열을 도입합니다. 예를 들어, % a는 약식 요일 이름 (예 : Sat)으로 바뀝니다. 기타 :

% a 축약 된 요일 이름 % 전체 요일 이름 % b 축약 된 월 이름 % B 전체 월 이름 % c 날짜 - 시간 위치 : Wed Oct 6 11:45:56 1993 년 % d 일 (01-31 % H 시간 (00-23) % I 시간 (01-12) % j 일 (001-366) % m 월 (01-12) % M 분 (00-59) % 오전 또는 오후 % % V 일주일 (01-53, ISO 8601 스타일) % u 일 (1-7 일, 월요일은 첫 번째 요일) % U 주 (00-53, 6 월) % W 주 (00-53, 첫 번째 월요일은 주 1의 첫날 임) % x date - as as : Wed Oct 6 1993 % X 시간 as : 23:59:59 % y year (00-99) % Y 연도 : 1993 % Z 시간대 (또는 결정할 수없는 경우 아무것도 표시하지 않음) %% 맨 위로 백분율 기호

다른 % 사양은 정의되지 않습니다. 다른 문자는 변경되지 않은 채 전달됩니다. C 로켈 만 지원됩니다.

-seconds 플래그는 에포크가 포맷 할 소스로 사용될 때까지의 시간 (초)을 나타냅니다. 그렇지 않으면 현재 시간이 사용됩니다.

-gmt 플래그는 타임 스탬프 출력이 GMT 시간대를 사용하도록합니다. 플래그가 없으면 현지 시간대가 사용됩니다.

트랩 [[명령] 신호]
주어진 신호가 나중에 수신 될 때 주어진 명령 이 실행되도록합니다. 이 명령은 전역 범위에서 실행됩니다. 명령 이 없으면 신호 동작이 반환됩니다. command 가 SIG_IGN 문자열이면, 신호는 무시됩니다. command 가 문자열 SIG_DFL이면, 신호는 시스템 디폴트의 결과입니다. 신호 는 단일 신호 또는 신호 목록입니다. 신호는 signal (3)과 같이 숫자 또는 기호로 지정할 수 있습니다. "SIG"접두어는 생략 할 수 있습니다.

인수 (또는 인수 -number)가 없으면 trap 은 현재 실행중인 trap 명령의 신호 번호를 반환합니다.

-code 플래그는 명령이 원래 실행을 시작했을 때 Tcl이 리턴하려고했던 모든 코드 대신에 명령의 리턴 코드를 사용합니다.

-interp 플래그는 트랩이 선언되었을 때보 다 명령이 실행을 시작했을 때 활성화 된 인터프리터를 사용하여 명령이 평가되도록합니다.

-name 플래그는 trap 명령이 현재 실행중인 trap 명령의 신호 이름을 리턴하도록합니다.

-max 플래그는 trap 명령이 설정할 수있는 최대 신호 번호를 리턴하도록합니다.

예를 들어, "trap {send_user"Ouch! "} SIGINT"명령은 "Ouch!"를 인쇄합니다. 사용자가 ^ C를 누를 때마다.

기본적으로 SIGINT (대개 ^ C 키를 눌러 생성 할 수 있음) 및 SIGTERM을 사용하면 Expect가 종료됩니다. 이것은 Expect가 시작될 때 기본적으로 생성되는 다음 트랩 때문입니다.

트랩 출구 {SIGINT SIGTERM}

-D 플래그를 사용하여 디버거를 시작하면 SIGINT가 대화식 디버거를 시작하도록 재정의됩니다. 이는 다음과 같은 함정 때문입니다.

함정 {exp_debug 1} SIGINT

디버거 트랩은 환경 변수 EXPECT_DEBUG_INIT를 새 트랩 명령으로 설정하여 변경할 수 있습니다.

물론 트랩 명령을 스크립트에 추가하여이 두 가지를 모두 무시할 수 있습니다. 특히 자신 만의 "trap exit SIGINT"가 있으면 디버거 트랩을 덮어 씁니다. 이것은 사용자가 디버거를 전혀 사용하지 못하게하려는 경우에 유용합니다.

SIGINT에 자신 만의 트랩을 정의하고 싶지만 디버거가 실행 중일 때 여전히 트랩을 잡으려면 다음을 사용하십시오 :

if {! [exp_debug]} {trap mystuff SIGINT}

또는 다른 신호를 사용하여 디버거에 트랩 할 수 있습니다.

트랩Expect에 내부적으로 사용되므로 SIGALRM에 대한 작업을 무시할 수 없습니다. disconnect 명령은 SIGALRM을 SIG_IGN (무시)으로 설정합니다. 후속 스폰 명령 중에 비활성화하는 한이 기능을 다시 활성화 할 수 있습니다.

자세한 정보는 signal (3)을 참조하십시오.

기다려 [args]
스폰 된 프로세스 (또는 명명되지 않은 경우 현재 프로세스 )가 종료 될 때까지 지연됩니다.

wait는 일반적으로 네 개의 정수 목록을 반환합니다. 첫 번째 정수는 대기 된 프로세스 의 PID입니다. 두 번째 정수는 해당하는 스폰 ID입니다. 세 번째 정수는 운영 체제 오류가 발생하면 -1, 그렇지 않으면 0입니다. 세 번째 정수가 0이면 네 번째 정수는 스폰 된 프로세스에 의해 반환 된 상태입니다. 세 번째 정수가 -1이면 네 번째 정수는 운영 체제에서 설정 한 errno 값입니다. 전역 변수 errorCode도 설정됩니다.

추가 요소는 wait 로부터 반환 값의 끝에 나타날 수 있습니다. 선택적 다섯 번째 요소는 정보 클래스를 식별합니다. 현재이 요소의 가능한 값은 CHILDKILLED이며, 그 다음 두 값은 C 스타일 신호 이름과 짧은 텍스트 설명입니다.

-i 플래그는 명명 된 spawn_id ( 프로세스 ID가 아님)에 해당하는 프로세스 를 대기 상태로 선언합니다. SIGCHLD 핸들러 내에서 스폰 ID -1을 사용하여 스폰 된 프로세스 를 기다리는 것이 가능합니다.

-nowait 플래그는 대기가 성공적인 대기 표시와 함께 즉시 리턴되도록합니다. 프로세스가 종료되면 (나중에) 명시 적으로 대기 할 필요없이 자동으로 사라집니다.

wait 명령은 "-i -1"인수를 사용하여 분기 된 프로세스 를 대기하는 데 사용될 수도 있습니다. 스폰 된 프로세스와 함께 사용하는 것과 달리이 명령은 언제든지 실행할 수 있습니다. 어떤 프로세스 가 수확되는지에 대한 통제는 없습니다. 그러나 리턴 값은 프로세스 ID에 대해 점검 될 수 있습니다.

라이브러리

Expect는 Expect 스크립트에 대해 두 가지 내장 라이브러리를 자동으로 인식합니다. 이것은 exp_library 및 exp_exec_library 변수에 명명 된 디렉토리에 의해 정의됩니다. 둘 다 다른 스크립트에서 사용할 수있는 유틸리티 파일을 포함합니다.

exp_library는 아키텍처 독립적 인 파일을 포함합니다. exp_exec_library는 아키텍처 종속 파일을 포함합니다. 시스템에 따라 두 디렉토리가 모두 비어있을 수 있습니다. $ exp_exec_library / cat-buffers 파일의 존재 여부는 / bin / cat이 기본적으로 버퍼링되는지 여부를 설명합니다.

PRETTY-PRINTING

pretty-print Expect 스크립트에는 vgrind 정의가 사용 가능합니다. Expect 배포본에 제공된 vgrind 정의가 올바르게 설치되었다고 가정하면 다음과 같이 사용할 수 있습니다.

vgrind -lexpect 파일

사용 예

페이지가 설명하는 모든 것을 함께 모으는 방법은 분명하지 않습니다. Expect 배포본의 예제 디렉토리에서 예제를 읽고 시험해 보는 것이 좋습니다. 그들 중 일부는 실제 프로그램입니다. 다른 것은 단순히 특정 기술을 설명하는 것이며, 물론 한 쌍은 간단한 해킹 일뿐입니다. INSTALL 파일에는 이러한 프로그램에 대한 간략한 개요가 있습니다.

Expect 논문 (SEE ALSO 참고)도 유용합니다. 일부 문서에서는 이전 버전의 Expect에 해당하는 구문을 사용하지만 이에 대한 설명은 여전히 ​​유효하며이 맨 페이지보다 훨씬 자세하게 설명되어 있습니다.

주의 사항

Extensions는 Expect의 명령 이름과 충돌 할 수 있습니다. 예를 들어, send 는 완전히 다른 목적으로 Tk에 의해 정의됩니다. 이러한 이유로 Expect 명령의 대부분은 "exp_XXXX"로도 사용할 수 있습니다. "exp", "inter", "spawn"및 "timeout"으로 시작하는 명령 및 변수에는 별칭이 없습니다. 환경간에 호환성이 필요한 경우 확장 명령 이름을 사용하십시오.

Expect 는 범위 지정에 대해 다소 자유주의적인 시각을 취합니다. 특히 Expect 프로그램과 관련된 명령으로 읽은 변수는 먼저 로컬 범위에서 찾고, 찾을 수없는 경우에는 전역 범위에서 찾습니다. 예를 들어, 이것은 당신이 쓰는 모든 프로 시저에 "global timeout"을 사용할 필요를 없애줍니다. 한편, 작성된 변수는 항상 "전역"명령이 발행되지 않는 한 로컬 범위에 있습니다. 이것이 발생시키는 가장 일반적인 문제는 프로 시저에서 스폰가 실행될 때입니다. 프로 시저 외부에서는 spawn_id 가 더 이상 존재하지 않으므로 스폰 된 프로세스 는 범위 지정 때문에 더 이상 액세스 할 수 없습니다. 그러한 프로 시저에 "전역 spawn_id"를 추가하십시오.

멀티 스패닝 기능을 사용할 수 없다면 (예 : select (BSD *. *), poll (SVR> 2) 또는 이에 상응하는 기능을 지원하지 않는 시스템), Expect 는 한 번에 하나의 프로세스 만 제어 할 수 있습니다. 이 경우 spawn_id 를 설정하지 마십시오. 또한 생성 된 프로세스 가 실행되는 동안 exec를 통해 프로세스를 실행해서는 안됩니다. 또한 여러 프로세스 (사용자를 포함한 프로세스)를 동시에 기대할 수 없습니다.

터미널 매개 변수는 스크립트에 큰 영향을 줄 수 있습니다. 예를 들어, 에코를 찾기 위해 스크립트를 작성하면 에코가 꺼져 있으면 오작동합니다. 이러한 이유로 Expect는 기본적으로 정상적인 터미널 매개 변수를 강제 실행합니다. 불행히도, 이로 인해 다른 프로그램에서 불쾌한 것을 만들 수 있습니다. 예를 들어, emacs 쉘은 "보통"매핑을 변경하려고합니다 : 개행 문자는 캐리지 리턴 개행 문자 대신에 개행 문자에 매핑되고 반향은 비활성화됩니다. 이렇게하면 이맥을 사용하여 입력 행을 편집 할 수 있습니다. 불행하게도, Expect는 이것을 추측 할 수 없습니다.

Expect가 터미널 매개 변수의 기본 설정을 덮어 쓰지 않도록 요청할 수 있지만 그러한 환경을위한 스크립트를 작성할 때는 매우주의해야합니다. 이맥스의 경우, 에코 및 줄 끝 매핑과 같은 것에 의존하지 마십시오.

인수를 받아 들인 인수는 단일 목록 ( 기대 변형 및 상호 작용 )에 들어감으로써 경험적 방법을 사용하여 목록이 실제로 하나의 인수인지 다수인지를 결정합니다. 휴리스틱은 목록이 실제로 공백 문자가 아닌 여러 개의 임베드 된 \ n을 가진 단일 인수를 나타내는 경우에만 실패 할 수 있습니다. 이것은 거의 불가능한 것처럼 보이지만 인수 "-nobrace"를 사용하여 단일 인수를 단일 인수로 처리하도록 할 수 있습니다. 이것은 기계가 생성 한 Expect 코드와 함께 사용될 수 있습니다. 마찬가지로, -brace는 단일 인수를 여러 패턴 / 동작으로 처리하도록합니다.

버그

"스마트 EXEC"또는 "Send-Expect"중 하나 인 "섹스"라는 프로그램의 이름을 유혹했으나 좋은 감각 (또는 단지 청교도)이 우세했습니다.

일부 시스템에서는 쉘이 생성되면 tty에 액세스 할 수 없다는 것에 불만을 표시하지만 어쨌든 실행됩니다. 이것은 시스템에 Expect 가 알지 못하는 제어 tty를 얻기위한 메커니즘이 있음을 의미합니다. 그것이 무엇인지 알아 내고,이 정보를 나에게 돌려 보내라.

Ultrix 4.1 (적어도이 버전의 최신 버전)은 1000000보다 큰 시간 초과를 0으로 간주합니다.

Digital UNIX 4.0A (및 다른 버전)는 SIGCHLD 처리기를 정의 할 경우 ptys 할당을 거부합니다. 자세한 내용은 grantpt 페이지를 참조하십시오.

IRIX 6.0은 pty 권한을 올바르게 처리하지 못하므로 Expect가 이전에 다른 사람이 사용한 pty를 할당하려고 시도하면 실패합니다. IRIX 6.1로 업그레이드하십시오.

TERM을 설정하지 않으면 텔넷 (SunOS 4.1.2에서만 확인 됨)이 중지됩니다. 이는 TERM을 정의하지 않는 cron 스크립트 및 at cron 스크립트에서 발생하는 문제입니다. 따라서 명시 적으로 설정해야합니다. 일반적으로 어떤 유형인지는 중요하지 않습니다. 그냥 뭔가를 설정해야합니다! 다음은 대부분의 경우에 충분할 것입니다.

set env (TERM) vt100

쉘과 홈이 설정되어 있지 않으면 팁 (BSDI BSD / OS 3.1 i386에서만 검증 됨)이 멈 춥니 다. 이는 cron , at 및 cgi 스크립트에서 이러한 환경 변수를 정의하지 않는 문제입니다. 따라서 명시 적으로 설정해야합니다. 즉, 일반적으로 어떤 유형이 아닌지를 명시 적으로 설정해야합니다. 그냥 뭔가를 설정해야합니다! 다음은 대부분의 경우에 충분할 것입니다.

set env (SHELL) / bin / sh set env (HOME) / usr / local / bin

ptys의 일부 구현은 프로세스 가 파일 디스크립터를 닫은 후 커널이 10-15 초 후에 읽지 않은 출력을 버리는 (실제 숫자는 구현에 따라 다름) 것처럼 설계되었습니다. 따라서 다음과 같은 프로그램을 기대하십시오.

예상 수면 20 기대

실패 할 것이다. 이를 피하기 위해, 비 대화식 프로그램을 스폰 하기보다는 exec로 호출하십시오. 그러한 상황을 생각할 수는 있지만 실제로는 진정으로 대화 형 프로그램의 최종 산출물이이 동작으로 인해 없어지는 상황을 경험 한 적이 없습니다.

반면에, Cray UNICOS ptys는 프로세스 가 파일 기술자를 닫은 직후 읽지 않은 모든 출력을 버립니다. 나는 이것을 Cray에게보고했고 그들은 고치기 위해 일하고있다.

때로는 tty 인터페이스가 UART 설정을 변경하거나 시작 / 정지 비트를 찾음으로써 보드 속도를 일치시키는 경우와 같이 프롬프트와 응답 사이에 지연이 필요합니다. 일반적으로이 모든 요구 사항은 1 ~ 2 초 동안 잠을 자도록하는 것입니다. 보다 강력한 기술은 하드웨어가 입력을받을 준비가 될 때까지 재 시도하는 것입니다. 다음 예제는 두 가지 전략을 사용합니다.

보내기 "속도 9600 \ r"; sleep 1 expect {timeout {send "\ r"; exp_continue} $ 프롬프트}

trap -code는 sleep과 같은 Tcl의 이벤트 루프에있는 명령과 함께 작동하지 않습니다. 문제는 이벤트 루프에서 Tcl이 비동기 이벤트 핸들러의 리턴 코드를 삭제한다는 것입니다. 해결 방법은 트랩 코드에 플래그를 설정하는 것입니다. 그런 다음 명령 바로 다음에 플래그를 확인하십시오 (즉, 절전).

expect_background 명령은 -timeout 인수를 무시하며 일반적으로 시간 초과 개념이 없습니다.

& # 34; 예상되는 힌트 & # 34;

Expect 에 관해서는 비 직관적 일 수있는 몇 가지가 있습니다. 이 섹션에서는 몇 가지 제안 사항을 통해 이러한 문제 중 일부를 해결하려고 시도합니다.

일반적인 예상 문제는 쉘 프롬프트를 인식하는 방법입니다. 이것들은 다른 사람이나 다른 쉘에 의해 다르게 커스터마이즈되기 때문에, 프롬프트를 모른 채 이식 가능한 자동화 된 rlogin은 어려울 수 있습니다. 환경 변수 EXPECT_PROMPT에 프롬프트 (특히 그 끝)를 설명하는 정규 표현식을 사용자가 저장하게하는 것이 합당한 규칙입니다. 다음과 같은 코드를 사용할 수 있습니다. EXPECT_PROMPT가 없으면 코드는 여전히 올바르게 작동 할 수 있습니다.

프롬프트 설정 "(% | # | \\ $) $"; # 기본 프롬프트 잡기 {프롬프트 설정 $ env (EXPECT_PROMPT)} expect -re $ prompt

내가보기를 기대 하는 것의 끝을 포함하는 예상 패턴을 작성하는 것이 좋습니다. 이렇게하면 전체 내용을보기 전에 질문에 답할 가능성이 없습니다. 또한, 전적으로 질문하기 전에 질문에 답할 수는 있지만, 일찍 대답하면 질문 중간에 답이 다시 표시 될 수 있습니다. 즉, 결과 대화는 정확하지만 뒤섞여 보입니다.

대부분의 프롬프트에는 끝에 공백 문자가 포함됩니다. 예를 들어, ftp 프롬프트는 'f', 't', 'p', '>'및. 이 프롬프트와 일치 시키려면 이러한 각 문자를 고려해야합니다. 공란을 포함하지 않는 것이 일반적인 실수입니다. 공란을 명시 적으로 넣으십시오.

X * 양식의 패턴을 사용하는 경우, *는 X의 끝에서 수신 된 모든 출력을 수신 한 마지막 것과 일치시킵니다. 직관적으로 들리지만 "마지막으로받은 내용"이라는 문구는 컴퓨터의 속도와 커널 및 장치 드라이버가 처리하는 I / O 처리에 따라 달라질 수 있으므로 다소 혼란 스러울 수 있습니다.

특히, 대부분의 프로그램이 한 번에 한 줄씩 출력을 생성 할 때 사람은 프로그램 출력이 거대한 청크 (원자 적으로)에 도착하는 경향이 있습니다. 이 경우를 가정하면 앞 단락의 패턴에있는 *는 더 많은 것으로 보이더라도 현재 줄의 끝과 일치 할 수 있습니다. 왜냐하면 일치의 시간에받은 모든 출력 이었기 때문입니다.

당신의 패턴이 구체적으로 설명하지 않는 한 더 많은 결과물이 나올 것을 알 수있는 방법이 없습니다.

심지어 라인 지향 버퍼링에 의존하는 것은 현명하지 못합니다. 프로그램이 버퍼링 유형에 대해 약속하는 경우는 거의 없으며 시스템 소화 불량으로 출력 라인이 끊어져 선이 임의의 위치에서 끊어 질 수 있습니다. 따라서 패턴을 쓸 때 프롬프트의 마지막 몇 문자를 표현할 수 있다면 그렇게하는 것이 좋습니다.

프로그램의 마지막 출력에서 ​​패턴을 기다리는 중이고 프로그램이 대신 다른 것을 내 보내면 timeout 키워드로 감지 할 수 없습니다. 그 이유는 expect 가 timeout을하지 않을 것이기 때문에 대신에 eof 표시를 얻을 것입니다. 대신 사용하십시오. 더 나은 방법은 둘 다 사용하는 것입니다. 이렇게하면 해당 행이 이동 한 경우 행 자체를 편집 할 필요가 없습니다.

줄 바꿈은 일반적으로 터미널 드라이버에서 출력 할 때 캐리지 리턴, 줄 바꿈 시퀀스로 변환됩니다. 따라서 printf ( "foo \ nbar")와 같이 두 줄을 명시 적으로 일치시키는 패턴을 원한다면 "foo \ r \ nbar"패턴을 사용해야합니다.

expect_user 를 통해 사용자로부터 읽을 때 비슷한 번역이 발생합니다. 이 경우 return 키를 누르면 개행 문자로 변환됩니다. 그런 다음 Expect 가 터미널을 원시 모드 (예 : 텔넷)로 설정하는 프로그램으로 전달하면 프로그램에서 실제 반환을 기대하기 때문에 문제가 발생할 수 있습니다. (어떤 프로그램은 실제로 자동 줄 바꿈을 리턴 값으로 변환한다는 점에서 용서를 받는다. 그러나 대부분은 그렇지 않다.) 불행하게도, 프로그램이 터미널을 원시 모드로 놓는다는 것을 알 수있는 방법이 없다.

수동으로 줄 바꿈을 리턴 값으로 바꾸는 대신 해결 방법은 "stty raw"명령을 사용하여 번역을 중지하는 것입니다. 그러나 이것은 더 이상 요리 된 라인 편집 기능을 얻지 못한다는 것을 의미합니다.

상호 작용은 암묵적으로 터미널을 원시 모드로 설정하므로이 문제는 발생하지 않습니다.

Expect 스크립트에 암호 (또는 다른 개인 정보)를 저장하는 것이 유용한 경우가 많습니다. 컴퓨터에 저장된 내용은 누구나 액세스 할 수 있으므로 권장하지 않습니다. 따라서 스크립트에서 암호를 대화 형으로 묻는 것이 말 그대로 문자를 포함시키는 것보다 더 똑똑한 아이디어입니다. 그럼에도 불구하고 때로는 이러한 삽입이 유일한 가능성입니다.

유감스럽게도 UNIX 파일 시스템에는 실행 가능하지만 읽을 수없는 스크립트를 직접 작성할 수있는 방법이 없습니다. setgid 쉘 스크립트를 지원하는 시스템은 다음과 같이 이것을 간접적으로 시뮬레이션 할 수 있습니다 :

평소와 같이 Expect 스크립트 (비밀 데이터가 포함되어 있음)를 만듭니다. 권한을 750 (-rwxr-x ---)으로 만들고 신뢰할 수있는 그룹 (즉, 그룹을 읽을 수있는 그룹)의 소유로 만듭니다. 필요한 경우이 용도로 새 그룹을 만드십시오. 그런 다음 이전과 동일한 그룹이 소유 한 권한 2751 (-rwxr-s-x)을 갖는 / bin / sh 스크립트를 작성하십시오.

결과는 누구든지 실행 (및 읽기) 될 수있는 스크립트입니다. 이 스크립트를 호출하면 Expect 스크립트가 실행됩니다.

& # 34; 참조 & # 34;

Tcl (3), libexpect (3)
Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995 년, "Exploring Expect : 대화식 프로그램 자동화를위한 Tcl 기반 툴킷"
Don Libes ( 1990 년 6 월 11 일 -15 일 캘리포니아, 애너하임, USENIX Conference, 1990 년 6 월 11-15 일)의 "Interactivity의 통제 할 수없는 적합성"을 기대하십시오 .
. "1990 년 10 월 17-19 일 콜로라도 주 콜로라도 스프링스의 1990 년 USENIX 대형 설치 시스템 관리 회의의 진행 보고서 인 Don Libes의"시스템 관리 작업 자동화에 대한 기대 "
.I "Tcl : Embeddable Command Language"John Ousterhout, 1990 년 1 월 22-26 일 워싱턴 1990 USENIX Conference의 집회. Don Libes, Computing Systems의 "대화식 프로그램 제어 스크립트"기대. , Vol. 4, 2 번, 캘리포니아 대학 언론 학회지, 1991 년 11 월. .. "회귀 테스트 및 적합성 테스트 대화식 프로그램", Don Ribes, 1992 년 여름 학술 발표회, US 135-120, San Antonio, TX, 1992 년 6 월 12 일 -15 일 .. "King Siegs, West Sussex, England, Vol.

1993 년 6 월 10-11 일, 1993 년 Tcl / Tk 워크샵, 캘리포니아 버클리에서 열린 Don Libes의 "Tcl 응용 프로그램 용 디버거", 23, 5, 1993 년 5 월.

저자

Don Libes, 국립 표준 기술 연구소

감사의 말

Tcl의 John Ousterhout과 영감을 얻은 Scott Paisley에게 감사드립니다. Expect의 자동 구성 코드에 대한 Rob Savoye에게 감사드립니다.

HISTORY 파일은 기대 의 진화에 대해 많은 것을 기록합니다. 흥미로운 독서를하고이 소프트웨어에 대한 더 깊은 통찰력을 줄 수도 있습니다. 그곳에 언급 된 사람들 덕분에 버그 수정을 보내고 다른 도움을주었습니다.

Expect의 설계 및 구현은 부분적으로 미국 정부에 의해 지불되었으므로 공개되어 있습니다. 그러나 저자와 NIST는이 프로그램과 문서 또는 그 일부가 사용될 경우 신용을 원합니다.