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