[Bioperl-l] standardize shebang line in bioperl scripts

Steven Lembark lembark at wrkhors.com
Thu Aug 30 03:22:13 UTC 2018


On Wed, 29 Aug 2018 12:19:54 +0100
Carnë Draug <carandraug+dev at gmail.com> wrote:

> Hi
> 
> I was wondering if there's any consensus about what should be used in
> the shebang line.  Looking at the existing scripts, I found:
> 
>     #!perl
>     #!/usr/bin/env perl
>     #!/usr/bin/perl
>     #!/usr/bin/perl -w
> 
> Using the bioperl distzilla plugin bundle, 'perl' and '/usr/bin/perl'
> get converted to the path of perl used for the package installation.
> However, if '/usr/bin/env perl' it remains unmodified.  This behaviour
> seems to be a bug in MakeMaker [1].
> 
> To me it makes sense to have the shebang line replaced with the perl
> used for installation since that's the one that will have the rest of
> bioperl modules.  But the most important thing, I think, is to be
> consistent.
> 
> If no one opposes soon, I will change all of them to '/usr/bin/perl'
> so that it gets fixed during install.

/usr/bin/perl is the last thing you want to standardize on.


POSIX did away with non-absolute path #! lines -- anything with #!perl
is *old* and no longer works on most systems.

#!/usr/bin/perl is largely unusable as it assumes you are using the
O/S installed versin of perl, which you usually aren't (unless you
want to use 5.8 on Centos or 5.10 on Redhat or 5.16 on Amazon linux).
You normally want to use /opt/perl/bin/perl (linux, SysV),
/usr/local/bin/perl (BSD), or ~/.perlbrew/whatever (just about
anything).

There is no good way other than $PATH to determine the preferred
perl to use. For example, you might change your path when testing
a new install to /opt/perl/5.26.1/bin/perl just to test that release
before symlinking it all into /opt/bin.

Net result: "env" is the only sane way to go.

Luvly thing is that env might be installed in /bin/env or /usr/bin/env
depending on Linux vs. BSD vs. SysV roots of whatever you are running
Perl on (let alone Windows...). 

The one most likely to work is:

    #!/usr/bin/env perl

linux habitually installs env into /bin with a symlink in /usr/bin;
BSD & SysV install it in /usr/bin maybe-without a symlink in /bin.

I any case using "/usr/bin/perl" either ties you to decade(s) out of
date perl with the O/S distro or forces you to update the disro perl,
which may break ancient pieces of the distro itself, and is nearly 
always the wrong thing to do.

-- 
Steven Lembark                                     3920 10th Ave South
Workhorse Computing                               Birmingham, AL 35222
lembark at wrkhors.com                                    +1 888 359 3508



More information about the Bioperl-l mailing list