我正在编写一个 shell 脚本,它在运行之前需要检查系统 Perl 更新是否没有破坏粘合在一起的 Perl 脚本。我不断收到看起来像解析错误的内容。要在命令行上重现此内容:
$ module='Scalar::Util'; check="perl -e 'use $module' 2>&1"; check_status=`$check`; echo $check
Can't find string terminator "'" anywhere before EOF at -e line 1.
perl -e 'use Scalar::Util' 2>&1
有人看到我做错了什么吗?
谢谢。
最佳答案
像这样处理带有空格的参数充其量是棘手的;尽量避免这样做。
你还应该使用更多的垂直空间; 'one-liners' 是一个贬义词,而不是一个认可的词。
你有:
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
强制 shell 重新解析行,没有错误。
小心;简单地使用 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
$
关于perl - Bash/shell 错误运行 perl -e 'use [module]' : Can't find string terminator "' "anywhere before EOF at -e line 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823867/