处理的论点与他们的空间一样,充其量是棘手的;尽量避免这样做。
您还应该使用更多的垂直空间; “单行条款”是一个贬义词,而不是批准条款。
您有:
module='Scalar::Util'
check="perl -e 'use $module' 2>&1"
check_status=`$check`
echo $check
麻烦的是,当shell进程:
`$check`
它分裂,在字的边界线,产生争论:
perl
-e
'use
Scalar::Util'
2>&1
注意I/O重定向被视为一个参数!为了避免这个问题,在这种情况下,你可以使用:
module='Scalar::Util'
check="perl -e 'use $module' 2>&1"
check_status=`eval $check`
echo $check
的eval
迫使外壳重新分析了线,没有得到任何错误。
要小心;仅仅使用eval
并不总是解决这些问题的方法。特别是,如果你有反斜杠,美元或反引号周围(或以上引号),然后eval
可以简单的化合物中的问题。检查Perl中是否存在一个模块的
一种方法是:
perl -M$module -e "print $module::VERSION . '\n'"
,使该模块的版本号(和复杂的字符串)。你也可以简单地做:
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
$
完美。奇迹般有效。谢谢!我同意你关于单线的观点。在我的脚本中,代码是垂直间隔的,但是在shell中,我将它打包成一行,所以我可以使用向上箭头进行大量重复试验。我应该使用单独的行来使问题示例中的可读性更高。 – David 2012-03-22 14:32:59
请不要暗示人们使用eval--如果不小心使用,这是一种生成安全漏洞的简单方法。 Bash有数组:'check =(perl -e“使用$ module”)',可引用为'“{{check [@]}”'(引号很重要,顺便说一句)......但为什么它会是希望将命令封装在数组中_或_字符串而不是shell函数我很不清楚。 – 2012-03-22 14:49:33
btw,'perl -M $ module -e exit'可以简化为'perl -M $ module -e1'。 – ikegami 2012-03-22 17:59:55