perl - Bash/shell 错误运行 perl -e 'use [module]' : Can't find string terminator "' "anywhere before EOF at -e line 1

标签 perl bash shell

我正在编写一个 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/

相关文章:

MySQL 查询在包含日语字符的 WHERE 子句中返回空集

perl - Win32::SerialPort 构造函数在给定引用变量时发生缓冲区溢出

bash - 回车前清空一行

linux - grep/根据第一个文件中的列表从第二个文件中获取字符串

perl - 无法在 Perl 中打开子目录中的文件

java - 在 Linux (Centos/Redhat) 上自动化 Inline::Java 安装

macos - 在 bash 脚本中自动输入密码

linux - bash awk - 如何从此行中提取单个字符

android - 获取 adb shell 命令的结果代码

linux - 在一组行之间排序