기대 스크립트에서 입력 버퍼를 어떻게 플러시 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1877015

  •  18-09-2019
  •  | 
  •  

문제

나는 기대 스크립트를 작성하고 있으며 쉘 프롬프트 (Linux)를 다루는 데 어려움이 있습니다. 내 기대 대본 스폰 rlogin 원격 시스템이 사용 중입니다 ksh. 원격 시스템의 프롬프트에는 현재 디렉토리와 " > " (공간보다 큰 공간). 스크립트 스 니펫은 다음과 같습니다.

send "some command here\r"
expect " > "

이것은 간단한 명령에 효과적이지만, 내가 보내는 명령이 터미널의 너비를 초과 할 때 상황이 잘못되기 시작합니다 (또는 더 정확하게 ksh 터미널의 너비라고 생각합니다). 이 경우 ksh 대화식 명령 줄의 이상한 가로 스크롤을 수행하는데,이 명령은 프롬프트를 다시 작성하고 출력에 추가 ">"를 고착시키는 것처럼 보입니다. 당연히 이것은 명령을 실행 한 후 출력에 하나 이상의 프롬프트가있는 것처럼 보일 때 기대 스크립트가 혼란스러워지고 동기화되지 않게합니다 (내 스크립트가 여러 개가 포함되어 있습니다. send/expect 한 쌍).

나는 변화를 시도했다 PS1 원격 시스템에서 "프롬프트>"와 같은 더 독특한 것들로 비슷한 문제가 발생하여 이것을 해결하는 올바른 방법이 아닙니다.

내가 생각하는 것은 스크립트가 "이 시점에서 원격 시스템과 적절하게 동기화되어 입력 버퍼를 플러시한다는 것을 알 수 있다는 것을 알 수 있습니다." 그만큼 expect 성명서가 있습니다 -notransfer 깃발 그렇지 않습니다 패턴이 일치하는 경우에도 입력 버퍼를 폐기하므로 반대가 필요하다고 생각합니다.

원격 쉘을보다 예측할 수있게하기 위해 사용할 수있는 다른 유용한 기술이 있습니까? 나는 기대가 많은 일을 통해 스폰 된 세션이 나타납니다 원격 시스템과 대화식이지만, 더 성가신 대화식 기능 중 일부 (예 : 수평 스크롤) ksh) 꺼집니다.

도움이 되었습니까?

해결책

지금까지 모든 출력이 보았던 모든 출력을 버리고 싶다면 시도해보십시오.

expect -re $

이것은 $의 Regexp 일치로 입력 버퍼의 끝을 의미하므로 지금까지받은 모든 것을 건너 뛸 수 있습니다. 자세한 내용 남자 페이지를 기대하십시오.

다른 팁

"세트 -o 멀티 린"또는 열 = 10000000 (또는 다른 적절한 큰 값)을 시도 할 수 있습니다.

나는 KSH에 어려움을 겪었고 과거에는 기대했습니다. 내 해결책은 로그인 쉘에 KSH 이외의 것을 사용하는 것이 었습니다.

원격 로그인을 KSH 이외의 다른로 변경할 수 있다면 (CHSH 명령 또는 편집 /etc /passwd를 사용) /bin /sh를 쉘로 시도 할 수 있습니다.

또 다른 대안은 KSH에게 터미널이 멍청한 터미널이라고 말하는 것입니다. 특별 처리를 수행하지 못하게합니다.

$ export TERM=""

트릭을 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top