我正在将clusterssh包装到openSUSE,并且需要将默认shebang从#!/usr/bin/env perl
更改为#!/usr/bin/perl
。 clusterssh使用Module::Build。
我可能会使用补丁(as Debian package do),但是我想知道fix_shebang_line(@files)
在RPM包装中是否易于使用。
答案 0 :(得分:1)
在构建过程中已经调用了它。
基本上,已卸载的脚本应使用#!/usr/bin/perl
或#!perl
,并且安装过程应将其重写为指向用于运行安装程序的perl
的位置。这样,/usr/bin/perl
安装的脚本将使用/usr/bin/perl
,而/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
安装的脚本将使用/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
。
(这适用于Module :: Build安装程序和ExtUtils :: MakeMaker安装程序。)
请注意,fix_shebang_line
的文档说它没有触及#!/usr/bin/env perl
的shebang行(因为它不被认为是对perl
的调用),因此只需修补脚本以使用用#!/usr/bin/perl
代替#!/usr/bin/env perl
可以解决问题。
进行此更改后,blib
生成的可安装的登台目录(./Build
)将包含已编辑的文件。
$ perl -e'CORE::say $^X'
/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
$ for fn in ccon crsh csftp cssh ctel; do printf '%-6s ' "$fn:"; head -n 1 "bin_PL/$fn"; done
ccon: #!/usr/bin/perl
crsh: #!/usr/bin/perl
csftp: #!/usr/bin/perl
cssh: #!/usr/bin/perl
ctel: #!/usr/bin/perl
$ perl Build.PL
Could not get valid metadata. Error is: ERROR: Missing required field 'dist_abstract' for metafile
Could not create MYMETA files
Creating new 'Build' script for 'App-ClusterSSH' version 'v4.13.203'
$ ./Build
Building App-ClusterSSH
Using perl binary: /home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
Using perl version v5.26.2
Generating: /home/ikegami/tmp/clusterssh/bin_PL/cssh
Generating: /home/ikegami/tmp/clusterssh/bin_PL/csftp
Generating: /home/ikegami/tmp/clusterssh/bin_PL/ccon
Generating: /home/ikegami/tmp/clusterssh/bin_PL/crsh
Generating: /home/ikegami/tmp/clusterssh/bin_PL/ctel
Generating: /home/ikegami/tmp/clusterssh/bin_PL/clusterssh_bash_completion.dist
$ for fn in ccon crsh csftp cssh ctel; do printf '%-6s ' "$fn:"; head -n 1 "blib/script/$fn"; done
ccon: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
crsh: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
csftp: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
cssh: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
ctel: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
我不必费心运行./Build install
,其主要任务是将文件从登台目录复制到其最终位置。此外,无论如何,都需要由软件包管理器替换该部分(假设您只是将blib
目录的内容放入软件包中)。
如果您需要某种方式自己做,则可以使用以下内容:
find bin -type f \
-exec perl -i -pe'
s/^#!\S*perl\S*/#!$^X/ if $. == 1;
close ARGV if eof;
' {} +
注意:
perl
。close ARGV if eof;
重置每个文件的行号($.
)。 eof
与eof()
不同,只有前者可以在这里工作。