EOF를 사용하지 않고 bash 스크립트에서 자동으로 텍스트 입력

EOF를 사용하지 않고 bash 스크립트에서 자동으로 텍스트 입력

저는 우분투 리눅스를 사용하고 있습니다. 프로그램 myprogram이 사용자에게 구체적으로 입력하라는 메시지를 표시하고 메시지가 표시되면 사용자는 정수를 입력해야 합니다 Enter. Bash 스크립트를 사용하여 이 프로세스를 자동화하고 싶습니다. 특히 100번 실행하고 싶습니다(~의 카운터를 사용 myprogram). 실행할 때마다 메시지가 표시되면 현재 값을 입력하고 싶습니다. i1100myprogrami

(BTW, myprogramoptions/switches 사용 시 -options이들 모두는 상수이므로 bash 스크립트에 지정됩니다.)

이 bash 스크립트의 불완전한 골격은 다음과 같습니다.

#!/bin/bash
for i in {1..100}
do
   myprogram -options
done

i이제 프로그램에서 메시지가 표시될 때 현재 값을 입력 하도록 위의 코드를 수정하고 싶습니다 . 이를 수행하는 가장 좋은 방법은 무엇입니까?

내가 사용하고 있는 소프트웨어에 대한 웹사이트 추천<<EOF줄의 끝 부분에 사용됩니다 myprogram -options. 나는 이것이 bash에게 사용할 입력을 위해 "파일 끝"을 보도록 지시한다고 생각합니다. 하지만 입력을 넣지 않으려면파일? or 바로 뒤에 넣으려면 <<어떻게 해야 하나요 <?

그 이유는 상황이 더욱 복잡해지기 때문이다. 예를 들어, j비선형, 비순차적 방식으로 변경되는 정수 카운터를 도입할 수 있습니다. 그런 다음 각 반복마다 to의 현재 값을 제공하고 싶지만 j호출과 파일 끝 사이에 myprogram값이 변경될 수 있습니다 .jmyprogram -optionsEOF

추천 메뉴가 무엇인가요?

답변1

거의 모든 프로그램에 대해 작동 echo $i | myprogram -options해야 하며 myprogram -options <<<$i표준 입력을 통해 프로그램을 제공 하십시오 $i.

<foostdin이라는 파일의 내용이 사용됩니다 foo.

<<foo이 텍스트와 로만 구성된 줄 사이의 텍스트는 foo표준 입력으로 사용됩니다. 이것은여기 문서(heredoc) Giles가 말했듯이 EOF실제로 파일의 끝을 의미하는 것은 아니며 단지 일반적인 구분 기호 설명자일 뿐입니다(이 경우 대신 "foo"를 사용합니다).

<<<foo표준 입력으로 문자열 "foo"를 사용합니다. $foo위에 표시된 대로 변수를 지정할 수도 있으며 셸은 해당 내용을 표준 입력으로 사용합니다. 이것은 ... 불리운다여기에 문자열, 구분된 문서처럼 전체 블록 대신 짧은 문자열을 사용하기 때문입니다. Herestring은 bash에서는 작동하지만 /bin/sh.

답변2

사이트에서 권장하는 구문은 다음과 같습니다.여기 문서. 파일 프로그램에 대한 입력은 포함된 줄 바로 아래에서 시작 <<EOF하고 스크립트 끝이 아니라 정확한 텍스트를 포함하는 줄에서 종료됩니다 EOF(추가 공백이 없도록 주의하세요). 그런데 쉘 특수 문자가 포함되지 않은 닫는 태그를 사용할 수 있습니다. EOF키워드가 아니라 단지 전통적인 것입니다.

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

답변3

위에서 언급한 Kevin과 Giles와 같은 파일이나 간단한 파이프는 많은 경우에 작동합니다.

더 복잡한 경우에는 Expect나 유사한 모듈을 살펴보는 것이 좋습니다(예: Expect::Simple CPAN 모듈은 사용하기 매우 쉬운 Perl 구현입니다). 개인적으로 나는 perl 모듈을 선호하지만(기대 자체는 tcl임) 일반적인 스크립팅 언어에 대한 구현이 많이 있습니다. 하나라도 써도 돼매우while 및 read를 사용하여 sh 또는 bash에서 이 아이디어를 기본적으로 구현하십시오.

Expect 및 유사한 도구의 일반적인 아이디어는 프로그램 출력에서 ​​지정된 문자열이나 패턴을 기다린 다음 원하는 입력을 제공하는 것입니다.

일반적인 사용 예는 "ogin:" 문자열을 "기대"(즉 대기)하고 로그인 이름을 보낸 다음 "word:" 문자열을 예상하고 비밀번호를 보내는 방식으로 로그인을 자동화하는 것입니다.

myprogram의 소스 코드가 있는 경우 마지막 옵션은 이를 수정하여 명령줄 옵션으로 제공하려는 입력을 얻는 것입니다. 이를 위해서는 더 많은 사전 작업이 필요할 수 있지만 Expect를 조작하거나 이러한 방식으로 사용하도록 설계되지 않은 프로그램으로 데이터를 전송하는 것보다 훨씬 간단합니다.

...그리고 패치를 myprogram 업스트림에 제출하는 것을 잊지 마세요 :) 코딩 방식이 마음에 들지 않더라도 기능 자체를 추가할 정도로 아이디어가 마음에 들 수도 있습니다. 업스트림 개발자는 요구하거나 불평하는 사람보다는 노력하고 기여하는 사람을 높이 평가하는 경향이 있습니다.

관련 정보