Estou tentando automatizar um processo de digitalização para um aplicativo físico. Meu roteiro é
#!/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"
Onde test2.sh é outro script no qual inicio o aplicativo no qual são feitas as varreduras. Um exemplo do que vai no segundo script é
#!/bin/bash
/home/mario/mg5/bin/mg5_aMC
"import model Implementation"
"generate u++ > l+ l+"
output firstscript$i
set vchi 6500
launch firstscript$i
Onde 'import model', 'output' e 'launch' são comandos da aplicação (que roda no terminal).
O que acontece é que os comandos (dentro da aplicação) não funcionam e recebo linhas como
PATH/test2.sh: linha 5: modelo de importação Implementação: comando não encontrado
Eu não tenho ideia de como fazer isso (que é escrever um script que pode escrever os comandos para o aplicativo) e tentei vários separadores diferentes, executando o script test2 em um shell diferente e chamando-o em um novo terminal usando terminal- gnomo. Como posso fazer isso funcionar?
Outra observação é que eu preciso que o valor da variável de i seja escrito dentro da aplicação. Eu tentei escrever, por exemplo, 'output firstscript$i', que não funcionaria mesmo se o comando funcionasse, imagino.
Como você executa o seu
test2.sh
como um script de shell separado, a variável de shelli
não está disponível nele. Isso significa que a expansão de$i
estará vazia notest2.sh
script. Você pode resolver isso de duas maneiras:Faça
i
uma variável de ambienteexport i
no primeiro script. Isso é conveniente, mas não é realmente uma boa solução no caso geral, pois o outro script pode querer usar sua própriai
variável, que pode ser independente de qualquer valor que a variável esteja no script de chamada.Dê
$i
na linha de comando dotest2.sh
script ao invocá-lo:test2.sh "$i"
. Isso tornaria possível acessar o valor$i
emtest2.sh
as"$1"
(o primeiro argumento da linha de comando).A segunda questão é que seu
mg5_aMC
programa espera receber entrada, ou seja, os comandos que você lista no script. Mas a forma como você os inseriutest2.sh
significa que eles seriam considerados comandos do shell . Não há nada no script que passe os comandos de controle especiais para o programa.Como você pode ver pelo erro que você recebe, é o shell que reclama que os comandos não podem ser encontrados. Eles não são comandos de shell, então isso (quando você sabe como as coisas serão interpretadas) não é surpresa.
Supondo que seu
mg5_aMC
programa leia a partir da entrada padrão, eu não escreveria um script de shell para cada execução do programa, mas forneceria um arquivo de controle/comando de entrada para ele:Aqui, o arquivo
input-template.in
pode ser algo comoEu escolhi usar
@thing@
para coisas que substituirei com ased
chamada no script de shell.Isso pressupõe que o valor de
$scan
não contém caracteres que perturbem osed
comando (como/
).Uma alternativa, se o script de controle do seu programa for razoavelmente curto, é usar "here-document" para alimentar os comandos de controle em seu programa:
Um here-document é basicamente um tipo de redirecionamento de um pedaço de texto que é fornecido, não em um arquivo, mas entre
<<TAG
e o finalTAG
. As variáveis no texto (se escritas como acima) seriam expandidas pelo shell antes de serem alimentadas em seu comando.