Expect를 사용하여 gdb를 자동화하려고 합니다. 내 스크립트는 gdb를 시작하고 일부 초기화를 수행한 다음 사용자에게 제어권을 전달합니다. Expect의 interact
명령은 작업에 완벽한 도구처럼 보였습니다.
이제 다음을 고려하십시오.
$ echo "spawn gdb
expect \"(gdb) \"
send \"help\r\"
expect \"(gdb) \"
interact" | expect -
내 컴퓨터에서 이 스크립틀릿은 gdb를 생성하여 예상대로 도움말 명령을 실행합니다. 그러나 즉시 스크립트를 종료하고 bash 프롬프트로 돌아갑니다. 사용자가 gdb에 머물면서 명령을 실행할 수 있기를 바랍니다.
내가 여기서 무엇을 놓치고 있는지 아시나요?
답변1
interact
expects
입력은 이제 닫힌 파이프인 표준 입력에서 가져옵니다 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
.