
실제 애플리케이션의 스캔 프로세스를 자동화하려고 합니다. 내 스크립트는
#!/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
. 이 문제는 두 가지 방법으로 해결할 수 있습니다.
첫 번째 스크립트에서
i
환경 변수를 만듭니다.export i
이는 편리하지만 일반적인 경우에는 좋은 해결책이 아닙니다. 다른 스크립트가i
호출 스크립트의 변수 값과 무관할 수 있는 자체 변수를 사용하려는 유혹을 받을 수 있기 때문입니다.스크립트를 호출할 때 스크립트의 명령줄에서 다음을
$i
제공합니다. 이렇게 하면 as(첫 번째 명령줄 인수)의 값에 액세스할 수 있습니다.test2.sh
test2.sh "$i"
$i
test2.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
. 텍스트의 변수(위와 같이 작성된 경우)는 명령에 입력되기 전에 셸에 의해 확장됩니다.