Как выполнить команду с частичным результатом из другой команды?

#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.