스크립트에서 가변 개수의 입력 자동화

스크립트에서 가변 개수의 입력 자동화

나는 대화형 스크립트를 자동화하기 위한 다음 세 가지 옵션을 이해합니다.

  • 실행 파일에 대한 응답을 파이프하십시오.yes '\n\n\n\n\nY\n' | ./script
  • yesCommand는 모든 질문에 대해 동일한 응답을 제공합니다.
  • 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 :-)

관련 정보