나는 대화형 스크립트를 자동화하기 위한 다음 세 가지 옵션을 이해합니다.
- 실행 파일에 대한 응답을 파이프하십시오.
yes '\n\n\n\n\nY\n' | ./script
yes
Command는 모든 질문에 대해 동일한 응답을 제공합니다.expect
명확한 답변 제공
제가 겪고 있는 상황은 다음과 같습니다.
많은 질문을 하는 스크립트가 있습니다. 실제로 질문 수는 스크립트 버전에 따라 달라질 수 있습니다. 마지막 질문은 이전의 모든 답변에 대한 예/아니요 확인입니다.
각 질문에는 목록에서 선택해야 합니다. 마지막 질문을 제외한 모든 질문에는 기본 답변이 있습니다. 따라서 "Enter" 키를 눌러 기본값을 적용할 수 있습니다.
내가 원하는 일:
스크립트를 실행할 때 모든 질문에 대해 기본값을 수락하고 마지막 질문에 대해 "Y"를 선택합니다.
위 옵션을 사용할 수 없는 이유는 무엇입니까?
- 파이프라인 - 문제 수는 스크립트 버전에 따라 다릅니다.
yes
명령 - 이것은 예/아니요인 마지막 질문을 설명하지 않습니다.expect
명령 - 질문 수는 다양합니다. Expect가 이 문제를 처리할 수 있을지 모르겠습니다.
다음은 작은 샘플입니다.
Installation Choice for Product A
********************************************************
0. Do not install Product A
1. Install Product A Version - 1.0.1.7
2. Install Product A Version - 1.1.4.8
ANSWER [0]: *Press Enter*
Installation Choice for Product B
********************************************************
0. Do not install Product B
1. Install Product B Version - 10.0.1.4239.03
2. Install Product B Version - 10.0.1.4239.04
ANSWER [2]: *Press Enter*
The package versions below have been selected for installation?
Product A Do not install
Product B 10.0.1.4239.04
Cancel=N, Download and Install=Y [Y/N] *Type 'Y' and press Enter*
각 질문마다 기본 답변이 다르기 때문에 "기본값"을 사용하는 것 외에 정답이 무엇인지조차 알 수 없습니다.
최종 경고: 실행하려는 스크립트를 편집할 수 없습니다.
답변1
예상되는 스크립트는 다음과 같습니다.
#!/usr/bin/expect
exp_internal 1 ; # remove this when you're done testing.
spawn /path/to/your/program
set timeout -1
expect {
-re {ANSWER \[\d+\]: $} {
send "\r"
exp_continue
}
{Cancel=N, Download and Install=Y} {
send "Y\r"
}
}
expect eof
비밀 요소는 exp_continue
기본적으로 명령의 맨 위로 "루프" expect
하여 주어진 패턴 중 하나와 다시 일치할 수 있도록 하는 것입니다.
답변2
나는 대화형 스크립트를 자동화하기 위한 다음 세 가지 옵션을 이해합니다.
expect
명확한 답변 제공
- 질문 개수는 다양합니다. Expect가 이 문제를 처리할 수 있을지 모르겠습니다.
나는 재건했다expect
해결책작성자: @glennjackman내 예제 중 하나를 사용하여 작동하게 만들었습니다. 이것은좋은 해결책, 하지만 조금 복잡합니다.
실행 파일에 대한 응답을 파이프하십시오.
yes '\n\n\n\n\nY\n' | ./script
- 질문 수는 스크립트 버전에 따라 다릅니다.
관로실제로 작동합니다. 좋은 대답이 나올 때까지 예/아니오 질문이 반복되므로 줄 바꿈을 충분히 제공하면 Y가 발견되고 해피 엔딩이 됩니다. 선택 질문의 최대 개수를 추정해야 합니다(약간의 여유를 두고). 이것은간단하고 빠른 솔루션스크립트를 사용하면 다양한 최대 숫자를 쉽게 테스트할 수 있습니다.
#!/bin/bash
if [ $# -eq 1 ]
then
maxq="$1"
else
echo "Enters default answers to the program 'trfix' and finishes with 'Y' (yes)"
echo "Usage: $0 <expected max number of questions>"
echo "Example: $0 15"
exit
fi
str="Y\n"
for ((i=0;i<"maxq";i++))
do
str="\n$str"
done
#echo -en "$str"
echo -en "$str"|./trfix
2개의 선택 질문으로 데모가 실행되고, maxq는 5로 설정됩니다.
$ ./check4Troncoso 5
Installation Choice for Product A
********************************************************
0. Do not install Product A
1. Install Product A Version - 1.0.1.7
2. Install Product A Version - 1.1.4.8
ANSWER [0]: *Press Enter*
Installation Choice for Product B
********************************************************
0. Do not install Product B
1. Install Product B Version - 10.0.1.4239.03
2. Install Product B Version - 10.0.1.4239.04
ANSWER [2]: *Press Enter*
The package versions below have been selected for installation?
Product A Do not install
Product B 10.0.1.4239.04
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Yes :-)