저는 우분투 리눅스를 사용하고 있습니다. 프로그램 myprogram
이 사용자에게 구체적으로 입력하라는 메시지를 표시하고 메시지가 표시되면 사용자는 정수를 입력해야 합니다 Enter. Bash 스크립트를 사용하여 이 프로세스를 자동화하고 싶습니다. 특히 100번 실행하고 싶습니다(~의 카운터를 사용 myprogram
). 실행할 때마다 메시지가 표시되면 현재 값을 입력하고 싶습니다. i
1
100
myprogram
i
(BTW, myprogram
options/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
값이 변경될 수 있습니다 .j
myprogram -options
EOF
추천 메뉴가 무엇인가요?
답변1
거의 모든 프로그램에 대해 작동 echo $i | myprogram -options
해야 하며 myprogram -options <<<$i
표준 입력을 통해 프로그램을 제공 하십시오 $i
.
<foo
stdin이라는 파일의 내용이 사용됩니다 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 업스트림에 제출하는 것을 잊지 마세요 :) 코딩 방식이 마음에 들지 않더라도 기능 자체를 추가할 정도로 아이디어가 마음에 들 수도 있습니다. 업스트림 개발자는 요구하거나 불평하는 사람보다는 노력하고 기여하는 사람을 높이 평가하는 경향이 있습니다.