Адаптация псевдонима "module" (вызывая modulecmd) из tcsh в bash - PullRequest
0 голосов
/ 05 июля 2018

В tcsh я могу запускать такие команды, как:

 module add jdk/1.8.0_162 

... используя псевдоним, определенный следующим образом:

alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'

Я пытаюсь получить эквивалент для bash.


В настоящее время я пытался создать отдельную функцию bash для каждой подкоманды, например так:

function module_add {
    /app/modules/0/bin/modulecmd bash add $1 2>>err.log
}

function module_rm {
    /app/modules/0/bin/modulecmd bash rm $1 2>>err.log
}

function module_list {
    /app/modules/0/bin/modulecmd bash list
}

java -version
module_list
module_rm 'j2re'
module_add 'jdk/1.8.0_162'
module_add 'gtk+/2.24.17'
module_list
java -version

Я могу быть уверен, что программные вызовы были выполнены, поскольку несуществующий модуль (добавленный по назначению для тестирования) gtk + / 2.24.17 создает запись в err.log.

Однако java -version по-прежнему показывает ту же старую версию, а module_list не показывает никаких новых модулей. Все прекрасно работает в tcsh (где я использую модуль добавить псевдоним вместо этого). Я пробовал разные версии модуля команды. Последняя протестированная версия - 3.2.10. Результат одинаковый на RHEL6 и RHEL7

Есть идеи, как решить эту проблему?

EDIT

Основываясь на некоторых умных комментариях, я попытался выполнить ту же команду для tcsh

/app/modules/0/bin/modulecmd tcsh add jdk/1.8.0_162

и это дало тот же результат. Любой, кто знает разницу между этой командой и

module add jdk/1.8.0_162 

в tcsh?

Так что, я думаю, вопрос скорее в том, чем отличаются модули cmcm от псевдонима tcsh module add

BR Patrik

1 Ответ

0 голосов
/ 05 июля 2018

modulecmd испускает сценарии оболочки на своем стандартном выводе (таким образом, аргумент, сообщающий ему, для какой оболочки создавать сценарий).

Оболочке нужно фактически выполнить эти команды, чтобы они вступили в силу; это то, что делает eval. (Никогда не используйте eval, если только вы не доверяете людям, написавшим программу, сгенерировавшую вывод, который вы eval строго относитесь к угловым случаям - она ​​ поддается ошибкам безопасности ) .

Таким образом, если существующий псевдоним tcsh для команды module:

alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'

... эквивалент bash:

module() { eval "$(/app/modules/0/bin/modulecmd bash "$@")"; }
...