복잡한 쉘 인터페이스가 있는 경우 Expect 스크립트를 어떻게 닫나요?

복잡한 쉘 인터페이스가 있는 경우 Expect 스크립트를 어떻게 닫나요?

나는 zsh안으로 tmux달려가고 있어요프레스토 악장, 기본 예상 스크립트가 올바르게 종료되지 않습니다.

set timeout -1
spawn $env(SHELL)
expect  -regex ".*"
send "echo 'foo'\r"
expect -regex ".*foo.*\r"
send "^D"
expect eof

결과 는 예상한 대로 출력되고 스크립트는 종료됩니다. 하지만 키보드를 foo누를 때까지 노출된 프롬프트는 삭제됩니다 . CTRL-C이 시점에서 a가 %인쇄되고 다음 줄이 나타납니다.

❯ ./modified-autoexpect-recording.exp
spawn /bin/zsh
echo 'foo'
❯ echo 'foo'
foo
~/ < ... fancy stuff ... ❯  ^C%  # this was a manual CTRL-C event from a broken prompt
~/ < ... fancy stuff ... ❯       # this is working

직접 자동으로 예상되는 결과는 동일한 문제를 야기합니다. 내가 주목한 한 가지는 다음과 같습니다.

~/long/path/here ❯ ^C%              
~/lo/pa/here ❯ # after exiting the frozen prompt

엔드 투 엔드 AutoExpect 예:

$: autoexpect
$: echo 'foo'
foo
$:[CTRL-D]
$: ./script.exp
$:[CTRL-C]%
$: # prompt works

다음 수정 후에도 동작은 동일하게 유지됩니다.

# changes at beginning
set log_user 0
set stty sane

# changes at end
send -- '^D' # -> send -- \x04

이는 축약되는 사용자 정의 프롬프트에 대한 경로와 관련이 있어야 합니다.

프롬프트 시스템을 변경하게 되어 기쁘지만, 이상적으로는 몇 가지 모드에서만 작동할 것으로 기대합니다.


나는 Don의 책(O'Reilly)을 검토 중이므로 아마도 답이 거기 있을 것입니다. 그동안 예상 프로그램을 정상적으로 종료할 수 있는 방법이 있나요?

관련 정보