![파이프/파일을 통해 부분 데이터를 보낸 다음 대화형으로 어떻게 보낼 수 있습니까?](https://linux55.com/image/45365/%ED%8C%8C%EC%9D%B4%ED%94%84%2F%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%86%B5%ED%95%B4%20%EB%B6%80%EB%B6%84%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EB%B3%B4%EB%82%B8%20%EB%8B%A4%EC%9D%8C%20%EB%8C%80%ED%99%94%ED%98%95%EC%9C%BC%EB%A1%9C%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B3%B4%EB%82%BC%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
실행하고 싶은 명령이 있습니다. 이를 이라고 부르겠습니다 program
. bash 또는 Python REPL과 유사한 대화형 프로그램입니다.
미리 정의된 입력을 사용하여 이 프로그램을 시작하고 싶습니다. 나는 노력했다 program << "some_commands"
. 하지만 실행이 완료된 후에는 some_commands
수동 상호작용을 계속할 수 없습니다.
이 프로그램이 bash라면 나는 .bashrc
이 목적으로 그것을 사용할 것이다.
미리 정의된 시작 입력이 있는 프로그램을 사용하는 올바른 방법은 무엇입니까?
답변1
Expect를 사용하지 않고도 이 작업을 수행할 수 있습니다.
{ echo foo ; cat ; } | command
답변2
expect
작업을 위한 도구는 다음과 같습니다.
#!/usr/bin/expect -f
spawn program
expect "I'm ready for input"
send "command 1\r"
expect "I'm ready for input"
send "command 2\r"
# ...
send "command last\r"
interact
이 interact
명령은 사용자에게 제어권을 반환합니다.
답변3
당신은 그것을 사용할 수 있습니다되감기프로그램과 상호 작용하십시오. Rlwrap은 bash에서 사용하는 것과 동일한 readline 라이브러리를 기반으로 한 줄 편집기를 제공합니다. 이는 일반적으로 이를 제공하는 프로그램의 줄 편집기만큼 좋지는 않지만(예를 들어 구문 색상 지정이나 완성 기능은 제공되지 않음) 백스페이스 키만 이해하는 기본 터미널 인터페이스보다 훨씬 낫습니다.
rlwrap -P 'some_commands' program
텍스트는 입력 버퍼로 전달되지만 프로그램에는 전달되지 않으므로 Enter프로그램을 시작한 후 키를 눌러야 합니다. 전체 텍스트가 단일 문자열로 전달됩니다. 개행 문자를 포함할 수 있습니다.