LINUX.ORG.RU

Lua, os.execute и баш

 ,


0

1

Привет, лор. Есть ли способ запустить из программы на луа башевскую команду source? Допустим, что у меня есть файл foo.sh:

#!/bin/bash

foo() {
    echo "bar"
}
Если прописать в консоли source foo.sh, то функция foo станет доступна в текущем сеансе и я смогу её выполнить.

Мне надо запустить луа-скрипт, чтобы он запустил мой foo.sh так, чтобы в текущем сеансе появилась функция foo. Есть ли способ это сделать? Если написать в foo.lua просто

-- foo.lua
os.execute('source ./foo.sh')
, а потом в чистой консоли я сделаю lua foo.lua, то ничего не произойдет, функция foo не появится.

PS так же интересует аналогичная ситуация, только для переменных


Ответ на: комментарий от arturpub

Можно попробовать lua foo.lua | source /dev/stdin, а внутри принт того сорца.

arturpub ★★ ()
Ответ на: комментарий от memnek

Нужно понимать, что шелл это обычный язык с интерактивным промптом, крутящийся в конкретном процессе, и кроме как интерактивно ничего туда «загрузить» не выйдет без поддержки с его стороны (в данном случае source из пайпа). Так же, как нельзя поменять переменную луа или создать луа-функцию через os.execute.

export всего лишь помечает переменную для передачи в envp при exec(), а запускаемый шелл забирает envp в обычные переменные, создавая видимость их наследования.

arturpub ★★ ()
Ответ на: комментарий от arturpub

Я могу написать на баше обёртку, которая могла бы передавать все аргументы луа-скрипту, ну а луа может печатать в stdout сурсы, вместо того, чтобы выполнить их. Но тогда придётся запускать эту обёртку опять же через source:

source wrapper.sh arg1 arg2
А я хочу, чтобы было хотя бы так:
./wrapper.sh arg1 arg2
но так тоже не будет работать, потому как будет запущен новый экземпляр. просто у меня луа генерит эти самые баш-скрипты, и хотелось бы, чтобы после их генерации, пользователь сразу смог бы использовать функции, описанные в этих скриптах, а не писать после запуска луа source /path/to/script.sh

Как вариант, можно дополнить ~/.bashrc строчками вида

source /path/to/script1.sh
source /path/to/script2.sh
...
но придётся заново запускать оболочку чтобы это заработало.

memnek ()
Последнее исправление: memnek (всего исправлений: 2)
Ответ на: комментарий от memnek
# .bashrc
loadfoo() {
    lua foo.lua /path/to/generated/script.sh
    source /path/to/generated/script.sh
}
$ loadfoo
$ foo

//мог ошибиться синтаксом, баш на память не знаю.

arturpub ★★ ()
Ответ на: комментарий от arturpub

ну да, я примерно так и сделаю. жаль конечно, я хотел сделать более-менее шелло- и платформонезависимой. в общем, спасибо тебе.

memnek ()
Ответ на: комментарий от anonymous

почему? мне надо запустить несколько программ по неким правилам, которые хранятся в файле настройки. шелл-скрипты и батники используются как вспомогательные вещи, там будет только несколько функций и переменных. просто хотелось сделать так, чтобы эти функции были бы доступны сразу после запуска луа-скрипта, но придётся писать обёртки.

memnek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.