Бэш-скрипт, взаимодействующий с приложением

Вы не можете заставить bash вызывать команды во время echo, насколько я знаю. Если я правильно понял ваш вопрос, вы ищете ключевое слово alias.

alias editor='emacs'
editor  # will invoke emacs

Вы можете сохранить псевдоним в вашем .bashrc или просто редактировать его на лету по своему усмотрению.

0
06.04.2019, 20:42
1 ответ

Поскольку вы запускаете test2.shкак отдельный сценарий оболочки, переменная оболочки iв нем недоступна. Это означает, что расширение $iбудет пустым в скрипте test2.sh. Вы можете решить это двумя способами:

  1. Сделайте iпеременной окружения через export iв первом скрипте. Это удобно, но не очень хорошее решение в общем случае, так как другой скрипт вполне может захотеть использовать свою собственную переменную i, которая может быть независимой от любого значения переменной в вызывающем скрипте.

  2. Укажите $iв командной строке скрипта 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. Переменные в тексте будут (, если они написаны, как указано выше, )будут расширены оболочкой перед вводом в вашу команду.

1
28.01.2020, 02:40

Теги

Похожие вопросы