답변:
이 경우를 위해 특별히 작성된 명령이 있습니다. yes
$ yes | ./script
이것이하는 일은의 출력 yes
을의 입력에 연결하는 것 입니다 ./script
. 따라서 ./script
사용자 입력을 요청하면 대신의 출력을 얻습니다 yes
. 출력은 yes
끝없는 스트림과 y
개행 문자입니다. 따라서 기본적으로 사용자가의 y
모든 질문에 입력하는 것처럼 ./script
.
n
yes ( y
) 대신 no ( ) 라고 말하면 다음과 같이 할 수 있습니다.
$ yes n | ./script
일부 도구에는 항상 yes
답변으로 가정 할 수있는 옵션이 있습니다. 예를 들어 여기를 참조하십시오 : 'apt-get upgrade'에서 yes / no 프롬프트를 무시하십시오 .
입력을 입력하는 다른 방법 :
y
스크립트가 얼마나 많은지를 정확히 알고 있다면 다음 과 같이 할 수 있습니다.
$ printf 'y\ny\ny\n' | ./script
줄 바꿈 ( \n
)은 Enter 키입니다.
printf
대신에 사용하면 yes
더 세밀한 입력 제어가 가능합니다.
$ printf 'yes\nno\nmaybe\n' | ./script
드문 경우이지만 명령에서 문자 다음에 Enter 키를 누르지 않아도됩니다. 이 경우 개행을 생략하십시오.
$ printf 'yyy' | ./script
완전성을 위해 here 문서를 사용할 수도 있습니다 .
$ ./script << EOF
y
y
y
EOF
또는 쉘이 here 문자열을 지원하면 :
$ ./script <<< "y
y
y
"
또는 한 줄에 하나의 입력으로 파일을 만들 수 있습니다.
$ ./script < inputfile
명령이 충분히 복잡하고 위의 방법으로 더 이상 충분하지 않으면 expect 를 사용할 수 있습니다.
다음은 매우 간단한 expect 스크립트의 예입니다.
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
기술적 인 nitpick :
귀하의 질문에 제시 한 가상 명령 호출이 작동하지 않습니다.
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
쉘 문법은 명령 행 어디에서나 경로 재 지정 연산자를 허용하기 때문입니다. 쉘에 관한 한 가상 명령 줄은 다음 줄과 같습니다.
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
즉 ./script
, 인수 'yyyyyyyyyyyyyy'
와 함께 호출되며 stdin은이라는 파일에서 입력을받습니다 echo
. 그리고 파일이 존재하지 않기 때문에 bash는 불평합니다.
cannot enable tty mode on non tty input
. 이에 대한 해결 방법을 알고 있습니까?
printf
트릭을 시도하면 run
오류 메시지가 표시 Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
되고 스크립트가 새 터미널에서 열리고 평소처럼 입력을 수동으로 입력하라는 메시지가 표시 됩니다. 그건 그렇고 데비안에서 일어나고 있습니다. 어떤 제안?
apt-get
예를 들어 어떤 것들은 자동 모드로 실행하기 위해 특수 플래그를 허용하고 기본값을 허용합니다. 년 apt-get
의 경우, 당신은 단지 그것을 통과 -y
플래그를. 이것은 스크립트에 완전히 의존합니다.
더 복잡한 것들이 필요한 경우 스크립트를 expect 스크립트로 묶을 수 있습니다. expect를 사용하면 출력을 읽고 입력을 보낼 수 있으므로 다른 스크립팅에서 허용하지 않는 매우 복잡한 작업을 수행 할 수 있습니다. 다음 은 Wikipedia 페이지의 예제 중 하나입니다 .
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
쉘 스크립트 와 함께 사용할 수 없습니다 . 아니면 방법이 있습니까?
cat
다음과 bash
같이 텍스트 파일에서 스크립트로 파이프 된을 사용하여 스크립트에 사용자 입력을 제공 할 수 있습니다 .
cat input.txt | bash your_script.sh
y, n, 숫자, 문자열 등 원하는 답변을 원하는 사용자 입력을 input.txt 파일에 넣으십시오.
-f
옵션이 특정 명령과 잘 작동합니다.