Вы не можете заставить bash вызывать команды во время echo
, насколько я знаю. Если я правильно понял ваш вопрос, вы ищете ключевое слово alias
.
alias editor='emacs'
editor # will invoke emacs
Вы можете сохранить псевдоним в вашем .bashrc
или просто редактировать его на лету по своему усмотрению.
Поскольку вы запускаете test2.sh
как отдельный сценарий оболочки, переменная оболочки i
в нем недоступна. Это означает, что расширение $i
будет пустым в скрипте test2.sh
. Вы можете решить это двумя способами:
Сделайте i
переменной окружения через export i
в первом скрипте. Это удобно, но не очень хорошее решение в общем случае, так как другой скрипт вполне может захотеть использовать свою собственную переменную i
, которая может быть независимой от любого значения переменной в вызывающем скрипте.
Укажите $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
. Переменные в тексте будут (, если они написаны, как указано выше, )будут расширены оболочкой перед вводом в вашу команду.