How to store output of module avail command in perl?

#!/depot/local/bin/perl5.8.0
my @data = `module avail icwbev_plus `;
print "Data Array : @data \n " ;

my $data1 = `module avail icwbev_plus `;
print "Data $data1 \n" ;

my $data2 = system (" module avail icwbev_plus ");
print "S Data $data2 " 

Выход:

Data Array :  
 Data  
S Data -1

I am not getting why it is not storing output to a variable. Пожалуйста, помогите мне решить это. Заранее спасибо.

3 ответа

Решение

module команда - это псевдоним оболочки или функция. Таким образом, он не может быть вызван напрямую через `` или system вызов.

Чтобы получить вывод подкоманды провайдера, вы должны вызвать modulecmd Команда, которая вызывается module псевдоним оболочки / функция.

Чтобы получить местоположение modulecmd в вашей системе введите обычный сеанс оболочки type module который выставляет команду, вызванную module псевдоним оболочки / функция.

Полный путь к modulecmd Команда может быть использована через тик или system позвонить, чтобы получить результат avail суб-команда:

Чтобы получить вывод module avail команда (в кратком формате для упрощения анализа):

#!/depot/local/bin/perl5.8.0
my $data1 = `/usr/share/Modules/libexec/modulecmd.tcl perl avail --terse icwbev_plus 2>&1`; 
print "Data $data1 \n"

Обратите внимание --terse Формат, используемый для упрощения анализа результатов. Также stderr перенаправляется на stdout для получения фактического результата команды (как modulecmd в основном использует stdout для вывода команд изменения среды).

Цитировать из документации дляsystem (Акцент добавлен):

Возвращаемое значение - это состояние выхода из программы, возвращаемое ожидающим вызовом. Чтобы получить фактическое значение выхода, сдвиньте вправо на восемь (см. Ниже). Смотрите также exec. Это не то, что вы хотите использовать для захвата вывода команды; для этого вы должны использовать просто backticks или qx//, как описано в "STRING" в perlop. Возвращаемое значение -1 указывает на ошибку при запуске программы или ошибку системного вызова wait(2) (проверьте $! По причине).

Это в сочетании с пустым выводом других попыток предполагает, что это module команда не присутствует на вашем пути, когда вы пытаетесь ее выполнить. (Я подозреваю, что если вы следовали передовой практике и включали use warnings; вы получите один об использовании неопределенного значения при попытке печати $data1)


В любом случае, если это module Команда присутствует на компьютере, на котором вы запускаете свой Perl-код, попробуйте использовать абсолютный путь к ней (my $data1 = qx!/foo/bar/module avail icwbev_plus!) или поместите каталог, в котором он находится, перед запуском скрипта.

module выводит в stderr, а не в stdout, который не перехватывается qx/backticks. Ты можешь попробовать:

`LMOD_REDIRECT=yes module avail ...`

См. https://lmod.readthedocs.io/en/latest/040_FAQ.html

Другие вопросы по тегам