Я пишу несколько файлов .lua для загрузки модулей в систему HPC.
По сути, приложение, которое я хочу создать в качестве модуля, — это Spack, и у него есть сценарий оболочки автозаполнения для его поиска в Linux с помощью:
source /apps/spack/share/spack/setup-env.sh
Я хочу запустить эту команду в своем файле .lua при загрузке модуля spack в систему, но я не могу заставить ее работать, выполнив следующие действия:
os.execute('source /apps/spack/share/spack/setup-env.sh')
Обратите внимание, что модуль загружается нормально, и я могу без проблем использовать spack, я просто хочу, чтобы функция автозаполнения работала при загрузке модуля.
Любая помощь приветствуется, спасибо!
И os.execute, и io.popen создают подпроцессы, имеющие собственную среду, поэтому они не влияют на среду ведущего приложения. Итак, задачу невозможно решить с помощью стандартных функций Lua.





Lmod поддерживает получение сценариев оболочки через функцию source_sh:
https://lmod.readthedocs.io/en/latest/260_sh_to_modulefile.html#using-source-sh
Теперь я обнаружил эту проблему при использовании следующего в скрипте .lua source_sh("bash", "/apps/spack/share/spack/setup-env.sh") ==> Ошибка: spack load требуется поддержка оболочки Spack. Чтобы настроить поддержку оболочки, выполните приведенную ниже команду для вашей оболочки. Для bash/zsh/sh: . /apps/spack/share/spack/setup-env.sh
Мне удалось сделать это с помощью этой функции.
execute{cmd = "source /apps/spack/share/spack/setup-env.sh", modeA = {"load"}}
По сути, после загрузки модуля он делает исходный код так, как ожидалось, и работает отлично.
Только для записи:
Я использовал эту команду раньше, но в spack работала только команда автозаполнения, и когда я выполнил загрузку spack, я получил ошибку, что мне нужно было сделать источник, чтобы получить правильные переменные среды.
source_sh("bash", "/apps/spack/share/spack/spack/setup-env.sh")
И ошибка:
==> Error: spack load requires Spack's shell support.
To set up shell support, run the command below for your shell.
For bash/zsh/sh: . /apps/spack/share/spack/
Спасибо за помощь, оказанную всем :)
Возможно, попробуйте использовать функцию
io.popen()