bash 스크립트가 대화 형 프롬프트에 응답하도록 함 [중복]


109

bash 스크립트가 일반적으로 기본 작업으로 사용자에게 표시되는 프롬프트를 자동으로 처리하도록 할 수 있습니까? 현재 bash 스크립트를 사용하여 사용자에게 작업을 완료하라는 메시지 (Y / N 프롬프트)를 표시하는 사내 도구를 호출하고 있지만 작성중인 스크립트는 완전히 "핸드 오프"여야합니다. Y|N프로그램이 계속 실행될 수 있도록 프롬프트 로 보낼 방법이 필요합니다 . 이게 가능해?


이 "자동 완성"...하지 @unwind 말한다처럼, 그것의 "자동화"
benzaita

3
yes이를 위해 사용 하는 예 : unix.stackexchange.com/questions/47344/…
Droogans

답변:


65

이것은 "자동 완성"이 아니라 자동화입니다. 이를위한 일반적인 도구 중 하나는 Expect 입니다.

에서 파이프 입력만으로 벗어날 수도 있습니다 yes.


3
불행히도 나는 이것을 실행하는 시스템에서 엄격한 공간 요구 사항이므로 기대할 수 없으므로 추가 패키지를 추가 할 수는 없지만 파이핑 yes이 트릭을 수행했습니다. 다행히 모든 프롬프트에는 어쨌든 'y'만 필요했습니다. 감사.
TJ L

그러나 Yes | command항상 작동하지 않을 수 있습니다. 설치 목적으로 만 사용 -y하는 경우 사용 하는 것이 더 좋고 선호되는 옵션입니다.
Umesh Kaushik

169

간단한

echo "Y Y N N Y N Y Y N" | ./your_script

이렇게하면 "Y"또는 "N"시퀀스를 스크립트에 전달할 수 있습니다.


3
를 보내야한다면 N이 방법을 사용했을 것입니다.하지만 Y 만 필요했기 때문에 yes. 둘 다 맞기 때문에 두 가지 대답을 받아 들일 수 없습니다.
TJ L

3
;) 글쎄, 만약 당신이 일부를 보내야한다면 당신 N은 그것을 할 수있는 좋은 방법이 있습니다.
Loïc Février

2
이것은 나를 위해 작동하지 않습니다. 공백은 새 줄로 계산되지 않습니다. 예를 들어 "Y N"을 에코하면 문자열 "Y N"을 첫 번째 프롬프트에 대한 입력으로 제공하고 내가 완료하기를 기다리는 두 번째 프롬프트에 멈 춥니 다. 나는 공백을 개행으로 변경하려고 시도했지만 작동하지 않았으며 여전히 프롬프트에 리터럴 문자열을 제공했습니다.
temporary_user_name

52
을 사용해보십시오 printf 'y\ny\ny\n' | ./your_script. 이렇게하면 예상되는 각 항목에 대해 개행을 수동으로 삽입합니다.
Majid

8
printf '%s\n' Y Y N N Y N Y Y N항목 사이에 줄 바꿈을 넣지 만 하나의 큰 형식 문자열이 필요하지 않습니다.
Charles Duffy

16

입력을 보내는 가장 좋은 방법은 cat과 텍스트 파일을 사용하여 필요한 입력을 전달하는 것입니다.

cat "input.txt" | ./Script.sh

예상대로 작동하지 않았습니다. 이것은이 질문에 대한 가장 간단하고 가장 좋은 대답입니다.
cloudxix

12

보낼 Y 만있는 경우 :

$> yes Y |./your_script

보낼 N 개만있는 경우 :

$> yes N |./your_script

9

내 상황에서는 Y 또는 N없이 텍스트 또는 공백으로 몇 가지 질문에 답해야했습니다. 내 상황에서이 작업을 수행하는 가장 좋은 방법은 쉘 스크립트 파일을 만드는 것입니다. 제 경우에는 autocomplete.sh라고 불렀습니다.

교리 스키마 내보내기에 대한 몇 가지 질문에 답해야했기 때문에 파일이 다음과 같이 보입니다.

- 이것은 예시 일뿐입니다 -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

이 전략에 대해 내가 좋아하는 점은 답변이 무엇인지 주석을 달 수 있고 EOF를 사용하여 빈 줄을 사용할 수 있다는 것입니다 (기본 답변). 이 내보내기 도구에는 이러한 질문에 답하기위한 자체 JSON 대응 도구가 있지만이 작업을 수행 한 후에 알아 냈습니다 =).

스크립트를 실행하려면 원하는 디렉토리에 'sh autocomplete.sh'있고 터미널에서 실행하면 됩니다.

간단히 말해서 리턴 라인과 함께 << EOL & EOF 사용 하면 필요에 따라 프롬프트의 각 질문에 답할 수 있습니다. 각각의 새로운 줄은 새로운 답입니다.

내 예제는`문자를 사용하여 주석으로 어떻게 수행 할 수 있는지 보여 주므로 각 단계가 무엇인지 기억할 수 있습니다.

이 방법의 다른 장점은 Y 또는 N 이상으로 대답 할 수 있다는 것입니다. 사실 공백으로 대답 할 수 있습니다!

이것이 누군가를 도울 수 있기를 바랍니다.


4

이를위한 특별한 내장 유틸리티가 있습니다- ' yes '.

같은 답으로 모든 질문에 답하려면 다음을 실행할 수 있습니다.

yes [answer] |./your_script

또는 스크립트 안에 각 질문에 대한 구체적인 답변을 넣을 수 있습니다.


스크립트 내에서 어떻게 할 수 있습니까? 각 질문에 대해 다른 답변을 지정
하려고합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.