【发布时间】:2011-02-06 00:38:07
【问题描述】:
我写了一个 Perl 脚本,我只是想把它交给每个人, 为此,我计划编写一个 bash 脚本,用于测试用户的环境并确定该环境是否能够运行 Perl 脚本。
我想测试以下内容:
- 该系统中是否安装了 Perl
- Perl 应该有版本 5 或更高版本
- 模块 JSON::Any 是否可用
任何建议将不胜感激:-)
【问题讨论】:
标签: bash perl perl-module
我写了一个 Perl 脚本,我只是想把它交给每个人, 为此,我计划编写一个 bash 脚本,用于测试用户的环境并确定该环境是否能够运行 Perl 脚本。
我想测试以下内容:
任何建议将不胜感激:-)
【问题讨论】:
标签: bash perl perl-module
关于检查 Perl 可用性,最简单的方法是检查命令perl -v 的返回码(退出码),如果不是0,则说明你没有 Perl。
现在关于 Perl 要求,您应该在您的 Perl 脚本中处理它们:
#!/usr/bin/env perl
use 5.006_001;
use ModuleName 2.0;
上面的 Perl 代码只能在 perl 5.6.1 或更高版本以及 modele "ModuleName" 2.0 或更高版本上运行。 无需手动从 bash 中检查 Perl 版本,直接从 Perl 脚本中检查会更好、更容易。
参考资料:
【讨论】:
use 5.006_001检查perl本身的版本号。 perl -v 只是检查是否可以执行 perl 二进制文件(=> 检查是否安装了 perl),您可以忽略它打印的所有内容,只是执行的返回值很重要。
不,不要编写 shell 脚本。 Perl 已经有一个非常好的方法来做到这一点。执行此操作的正确方法是使用普通工具链构建 CPAN-ready 发行版。其中一些在perlnewmod、perlmodstyle 和perlmodinstall 中有解释。
对于一个最小的工作示例,创建一个目录布局:
.
├── Build.PL
├── README
└── script
└── abuscript.pl
在Build.PL 文件中,输入:
use 5.000;
use Module::Build qw();
Module::Build->new(
module_name => 'abuscript',
dist_version => '1.000',
dist_author => 'abubacker <abubacker@example.com>',
dist_abstract => 'describe what the script does in one sentence',
configure_requires => {
'perl' => '5.000',
},
requires => {
'JSON::Any' => 0,
},
)->create_build_script;
根据您的目的更改详细信息。
在README文件中,放一些安装说明,例如:
To install this module, run the following commands:
perl Build.PL
./Build install
完成所有这些后,您可以运行:
perl Build.PL
./Build manifest
./Build dist
这将产生一个您将分发的.tar.gz 存档。告诉您的用户像安装任何其他 CPAN 模块一样安装它,或者如果他们不知道这意味着什么,他们应该阅读自述文件。
如果您有时间,我建议您将脚本转换为模块。程序pl2pm(Perl 自带)和CPAN 模块Module-Starter-PBP 为您提供帮助。
如果许可证允许,您可以将您的代码上传到 CPAN,以使您的用户更加方便。首先在以下任何地方寻求帮助:邮件列表module-authors@perl.org、网络论坛PerlMonks、MagNET 上的IRC 频道#toolchain (irc://irc.perl.org/toolchain)
【讨论】:
Fus::Roh::Da,请将其重命名为Da.pm 并将其移动到lib/Fus/Roh/Da.pm。在Build.PL 中,指定module_name => 'Fus::Roh::Da'。只需将您的两个脚本放入子目录script,其余的将在安装时自动运行。 – 您可以通过运行perl Build.PL --install_base /tmp ; ./Build install 来测试您的构建文件,并在/tmp 目录中检查结果。运行./Build distclean 并手动删除已安装的文件以重新开始。
/usr/lib/perl5/site_perl/auto/TerminalHero。顺便说一句,Build 可以温和地询问 root 密码,而不是大喊大叫 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ERROR: Can't create '/usr/lib/perl5/site_perl/auto/TerminalHero' Do not have write permissions on '/usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sudo ./Build install 或功能相似。 Build 可以要求输入 root 密码,但这将禁止无人值守安装,这一步只是其中的一小部分;在这种情况下还添加了大喊大叫,因为否则它会在屏幕上滚动而不会被注意到。 - 您可以配置cpan (make_install_make_command and mbuild_install_build_command) 和cpanm (-S switch) 以使用sudo,然后通过这些工具之一安装您的发行版。
if perl -MJSON::Any -e 'print "$JSON::Any::VERSION\n"' >/dev/null 2>&1
then : OK
else echo "Cannot find a perl with JSON::Any installed" 1>&2
exit 1
fi
我经常使用 '${PERL:-perl}' 和类似的结构来识别命令(awk vs nawk 或 gawk;troff vs groff;等等)。
如果您想测试 JSON::Any 的版本,请改为捕获命令的输出。
如果您想测试 Perl 的版本,请添加 'use 5.008009;' 或您认为合理的任何数字。 (就在不久前,他们终于从一个工作中的 NFS 挂载文件系统中删除了 Perl 4 - 但这不是机器上唯一的 Perl - 至少,在过去十年或更长时间里没有!)
【讨论】:
perl -MJSON::Any -e1 2>/dev/null - 打印版本并将其发送到比特桶有什么意义