왜 상호 작용 명령이 작동하지 않습니까?

왜 상호 작용 명령이 작동하지 않습니까?

Expect를 사용하여 gdb를 자동화하려고 합니다. 내 스크립트는 gdb를 시작하고 일부 초기화를 수행한 다음 사용자에게 제어권을 전달합니다. Expect의 interact명령은 작업에 완벽한 도구처럼 보였습니다.

이제 다음을 고려하십시오.

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -

내 컴퓨터에서 이 스크립틀릿은 gdb를 생성하여 예상대로 도움말 명령을 실행합니다. 그러나 즉시 스크립트를 종료하고 bash 프롬프트로 돌아갑니다. 사용자가 gdb에 머물면서 명령을 실행할 수 있기를 바랍니다.

내가 여기서 무엇을 놓치고 있는지 아시나요?

답변1

interactexpects입력은 이제 닫힌 파이프인 표준 입력에서 가져옵니다 echo.

대신 작성할 수 있습니다(ksh/zsh/bash 구문).

expect <(echo "spawn gdb
  expect \"(gdb) \"
  send \"help\r\"
  expect \"(gdb) \"
  interact" )

여전히 파이프를 통해 제공되지만 이번에는 파이프가 경로 인수로 제공되므로 expect예상되는 표준 입력은 영향을 받지 않습니다.

하지만 이 경우에는 분명히 다음과 같이 작성할 수 있습니다.

expect -c '
  spawn gdb
  expect "(gdb)"
  send "help\r"
  expect "(gdb) "
  interact'

expect대부분의 쉘은 sh이를 허용합니다 -c.

여전히 명령 출력을 전달해야 하는 경우( echo귀하의 경우처럼) -c다음 명령을 사용하여 그렇게 할 수도 있습니다.

expect -c "$(echo...)"

expect그러나 이는 명령이 완료될 때까지 파이프와 반대되는 메서드가 시작되지 않음을 의미합니다 .

그건 그렇고, 여기에서는 .gdbinit 파일이나 -ix옵션을 대신 사용할 수 있지만 gdb실제로는 필요하지 않습니다 expect.

관련 정보