2013-01-18 5 views
52

예를 들어 yes/no 옵션과 같이 대화식으로 인수를 읽는 read 명령을 사용하는 bash 스크립트가 있습니다. 기본 옵션 값을 인수로 전달하는 비대화 형 스크립트에서이 스크립트를 호출하는 방법이 있습니까?대화식 프로그램에 대화식으로 인수 전달

대화 형 스크립트로 전달해야하는 것은 하나의 옵션 만이 아닙니다.

+2

stdin에서 읽는 경우 입력 내용을 파이프 할 수 있습니다. –

+2

이 질문은 많은 중복을 가져 오므로 대화식 프로그램이 작성된 언어가 중요하지 않음을 지적하는 것이 좋습니다. 표준 입력 또는 Erlang 응용 프로그램을 읽는 C 프로그램이 될 수 있습니다. 명령 줄에서 실행되는 무언가가 있으며 불쾌하게 대화 형 입력을 요구하며이를 자동화하려고합니다. – tripleee

답변

22

MOR에 사용하는 사용 복잡한 작업은 expect (http://en.wikipedia.org/wiki/Expect)입니다. 기본적으로 사용자를 시뮬레이트합니다. 스크립트를 작성하여 특정 프로그램 출력 및 관련 항목에 대응하는 방법을 코딩 할 수 있습니다.

암호를 바꿀 수없는 ssh과 같은 경우에도 작동합니다.

+3

... SSH 경우의 적절한 해결책은 공개 키 인증으로 전환하는 것입니다. – tripleee

11

당신은 파일의 데이터를 넣을 수 있습니다,이처럼 다시 직접 :

$ cat data.txt 
2 
3 

스크립트 실행 :

$ file.sh < data.txt 
2 
3 
88

을 스크립트의

$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

데이터 다양한 방법

파이프 y 파일에서 우리의 입력

echo "yes 
no 
maybe" | your_program 

리디렉션

your_program < answers.txt 

here document (이것은 매우 읽을 수 있습니다)

your_program << ANSWERS 
yes 
no 
maybe 
ANSWERS 

here string

your_program <<< $'yes\nno\nmaybe\n' 
+2

이것은 프로그램이 표준 입력을 읽는 경우에만 작동한다는 것을 지적합니다. 일부 프로그램은 예를 들어 읽는 데 방해가됩니다. 표준 입력이 파이프 인 경우에도 대화식으로 암호를 입력 할 수 있습니다. 암호의 경우 이는 보안상의 이유로 적합합니다. 일부 대화식 프로그램은 단순히 잘못 설계된 것입니다. – tripleee

+0

@tripleee 당신이 말한 것과 마찬가지로 스크립트는 stdin의 영향을받지 않는 암호를 어떻게 읽습니까? 나는 당신이 stdin을 잡기 위해'read'를 사용할 수 있다는 것을 알고 있습니다, 당신은 당신이 묘사 한 것을 어떤 기능을 사용할 수 있습니까? – flow2k

+0

그런 경우 상호 작용하려는 프로그램에 입력을 전송하는 특수한 방법 (예 : sshpass, ssh-agent)이 있는지 또는 상호 작용을 스크립팅하기 위해 expect를 사용해야하는지 확인해야합니다. –

3

하나만 더 추가하고 싶습니다. 그것을 다른 곳에서 발견하고 아주 간단합니다. 명령 "execute_command"에 대한 명령 줄에서 모든 프롬프트에 대해 yes를 전달하고 싶다고 말하면 간단히 yes로 파이프합니다.

yes | execute_command 

예/아니오 프롬프트에 대한 답변으로 yes가 사용됩니다.