Обработка аргументов с пробелами в них, как это сложно в лучшем случае;постарайтесь избегать этого.
Вы также должны использовать больше вертикального пространства;«однострочники» - это уничижительный термин, а не термин одобрения.
У вас есть:
module='Scalar::Util'
check="perl -e 'use $module' 2>&1"
check_status=`$check`
echo $check
Проблема в том, что при обработке оболочки:
`$check`
разбивает строку на границах слова, получая аргументы:
perl
-e
'use
Scalar::Util'
2>&1
Обратите внимание, что перенаправление ввода / вывода рассматривается как аргумент!Чтобы избежать проблемы, в этом контексте вы можете использовать:
module='Scalar::Util'
check="perl -e 'use $module' 2>&1"
check_status=`eval $check`
echo $check
eval
заставляет оболочку выполнить повторный анализ строки, не получая ошибок.
Будьте осторожны;простое использование eval
не всегда является решением этих проблем.В частности, если у вас есть обратный слеш, доллары или обратные косые черты (или несколько кавычек), тогда eval
может просто составить проблему.
Один из способов проверить, существует ли модуль в Perl:1025 *
Это дает номер версии модуля (и усложняет строку).Вы также можете просто сделать:
perl -M$module -e exit
, который выйдет со статусом 0, если модуль загружен, и выдаст ошибки и т.д., если это не так.
$ perl -MSalar::Util -e exit
Can't locate Salar/Util.pm in @INC (@INC contains: /Users/jleffler/Perl/v5.14.1-64/lib/perl5/site_perl/5.14.1/darwin-2level /Users/jleffler/Perl/v5.14.1-64/lib/perl5/site_perl/5.14.1 /Users/jleffler/Perl/v5.14.1-64/lib/perl5/5.14.1/darwin-2level /Users/jleffler/Perl/v5.14.1-64/lib/perl5/5.14.1 .).
BEGIN failed--compilation aborted.
$ echo $?
2
$