處理的論點與他們的空間一樣,充其量是棘手的;儘量避免這樣做。
您還應該使用更多的垂直空間; 「單行條款」是一個貶義詞,而不是批准條款。
您有:
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