애플리케이션과 상호작용하는 Bash 스크립트

애플리케이션과 상호작용하는 Bash 스크립트

실제 애플리케이션의 스캔 프로세스를 자동화하려고 합니다. 내 스크립트는

#!/bin/bash

i=1
file="ATLASbins.txt"
while IFS= read line 
do
    scan=$line
    cat test.sh | sed     "s/ set vchi 5000/ set vchi $scan/g" > test2.sh
    chmod +x test2.sh
    bash -x  /home/mario/Mine/test2.sh
    i=$((i + 1))
done <"$file"

test2.sh는 스캔을 수행하는 애플리케이션을 시작하는 또 다른 스크립트입니다. 두 번째 스크립트의 내용 예시는 다음과 같습니다.

#!/bin/bash
/home/mario/mg5/bin/mg5_aMC

"import model Implementation"

"generate u++ > l+ l+"

output firstscript$i

set vchi 6500

launch firstscript$i

여기서 "모델 가져오기", "출력" 및 "시작"은 애플리케이션의 명령입니다(터미널에서 실행).

응용 프로그램 내부의 명령이 작동하지 않고 다음과 같은 줄이 표시됩니다.

PATH/test2.sh: 5행: 가져오기 모델 구현: 명령을 찾을 수 없습니다.

나는 이 작업을 수행하는 방법(예: 응용 프로그램에 명령을 작성할 수 있는 스크립트 작성)을 모르고 다양한 구분 기호를 시도하고 다른 쉘에서 test2 스크립트를 실행하고 터미널을 사용하여 새 터미널(dwarf)에서 호출했습니다. 어떻게 해야 하나요?

또 다른 관찰은 애플리케이션 내부에 i의 변수 값을 작성해야 한다는 것입니다. "output firstscript$i"와 같이 이렇게 작성해 보았는데 명령이 작동하더라도 작동하지 않을 것 같습니다.

답변1

test2.sh별도의 쉘 스크립트로 실행 중이므로 쉘 변수를 사용할 i수 없습니다. 이는 스크립트의 확장자가 $i비어 있음을 의미합니다 test2.sh. 이 문제는 두 가지 방법으로 해결할 수 있습니다.

  1. 첫 번째 스크립트에서 i환경 변수를 만듭니다. export i이는 편리하지만 일반적인 경우에는 좋은 해결책이 아닙니다. 다른 스크립트가 i호출 스크립트의 변수 값과 무관할 수 있는 자체 변수를 사용하려는 유혹을 받을 수 있기 때문입니다.

  2. 스크립트를 호출할 때 스크립트의 명령줄에서 다음을 $i제공합니다. 이렇게 하면 as(첫 번째 명령줄 인수)의 값에 액세스할 수 있습니다.test2.shtest2.sh "$i"$itest2.sh"$1"

두 번째 문제는 mg5_aMC프로그램이 입력, 즉 스크립트에 나열한 명령을 기대한다는 것입니다. 그러나 이러한 항목을 입력하는 방식은 다음 test2.sh과 같이 처리된다는 것을 의미합니다.쉘 명령. 스크립트의 어떤 것도 프로그램에 특수 제어 명령을 전달하지 않습니다.

받은 오류에서 볼 수 있듯이 명령을 찾을 수 없다고 불평하는 것은 쉘입니다. 이는 쉘 명령이 아니므로 (해석하는 방법을 알고 있다면) 이는 놀라운 일이 아닙니다.


귀하의 mg5_aMC프로그램이 표준 입력에서 읽는다고 가정하면, 저는 귀하의 프로그램이 실행될 때마다 쉘 스크립트를 작성하지 않고 대신 입력 제어/명령 파일을 제공합니다.

#!/bin/bash

file="ATLASbins.txt"

i=1
while IFS= read -r scan 
do
    sed -e "s/@scan@/$scan/" \
        -e "s/@i@/$i/" \
        input-template.in >input.in

    /home/mario/mg5/bin/mg5_aMC <input.in

    i=$((i + 1))
done <"$file"

여기서 파일은 input-template.in다음과 같습니다.

"import model Implementation"
"generate u++ > l+ l+"
output firstscript@i@
set vchi @scan@
launch firstscript@i@

나는 쉘 스크립트의 호출 @thing@로 대체될 sed작업 에 이를 사용하기로 결정했습니다.

이는 값에 명령을 방해하는 문자(예 : )가 $scan포함되어 있지 않다고 가정합니다 .sed/


프로그램의 제어 스크립트가 상당히 짧은 경우, 또 다른 접근 방식은 "여기 문서"를 사용하여 프로그램에 제어 명령을 입력하는 것입니다.

#!/bin/bash

file="ATLASbins.txt"

i=1
while IFS= read -r scan 
do
    /home/mario/mg5/bin/mg5_aMC <<END_INPUT
"import model Implementation"
"generate u++ > l+ l+"
output firstscript$i
set vchi $scan
launch firstscript$i
END_INPUT

    i=$((i + 1))
done <"$file"

<<TAG여기서 문서는 기본적으로 파일에 제공되지 않고 와 와 끝 사이에 제공되는 텍스트 조각의 리디렉션 유형입니다 TAG. 텍스트의 변수(위와 같이 작성된 경우)는 명령에 입력되기 전에 셸에 의해 확장됩니다.

관련 정보