#bash #environment-modules
#bash #окружающая среда-модули
Вопрос:
У меня есть:
$ module avail firefox --latest
---------------------------------------------------------- /env/common/modules -----------------------------------------------------------
firefox/83.0
Я хотел бы извлечь firefox/83.0
часть приведенного выше результата в новую команду:
$ module load firefox/83.0
Это то, что у меня есть до сих пор, но, похоже, я не могу передать результат из grep
следующей команды:
$ module avail firefox --latest | grep firefox | echo module load
Примечание: это относится к версии модулей, которая не имеет такой module load app/latest
возможности.
Комментарии:
1. Какая платформа? Какая версия Bash?
2. CentOS 7, bash 4.2.
3. И какой пакет предоставляет эту
module avail
команду? Укажите все необходимые детали воспроизведения в вашем вопросе , чтобы мы могли дать наилучший ответ. (С уважением, вы уже должны знать, как сформулировать хороший вопрос!)4. Да, хе-хе, вы правы, я добавил некоторые подробности в исходное сообщение. Я подумал, что это скорее вопрос, связанный с конвейером.
Ответ №1:
Используйте регулярное выражение только для захвата firefox/83.0
, затем используйте подстановку команд, чтобы использовать этот результат в следующей команде;
module load $(module avail firefox --latest | sed -nre 's/^firefox/[^0-9]*(([0-9] .)*[0-9] ).*//p'
Дополнительная информация о регулярном выражении: как извлечь номер версии с помощью sed?
Использование xargs
;
module avail firefox --latest | sed -nre 's/^firefox/[^0-9]*(([0-9] .)*[0-9] ).*//p' | xargs module load
Ответ №2:
module load "$(module avail firefox --latest | grep -Eo 'firefox/[[:digit:]] .[[:digit:]] ')"
Используйте вывод команды module avail, а затем выполните поиск firefix, за которым следует /, а затем цифра один или несколько раз, точка, а затем цифра один или несколько раз. используйте этот вывод как часть команды загрузки модуля
Комментарии:
1. Передача
--json
была бы намного более надежной, чем все это хрупкое сопоставление текста. Хотя тогда вам нужен анализатор JSON.
Ответ №3:
не похоже, что я могу передать результат из grep в следующую команду:
Вы можете, но вам нужно использовать другую команду, которая будет считывать данные из канала и добавлять их в качестве аргументов команды. Так просто, как:
$ module avail firefox --latest | grep firefox | xargs module load
Комментарии:
1. Я забыл упомянуть об этом в исходном сообщении, но я попробовал это, и это дает мне:
xargs: module: No such file or directory
2. Похоже,
module
это либо псевдоним, либо функция bash.