21
The Perl Shebang
Often overlooked, the shebang of a Perl program is a comment on the first line which tells the (Unix-like) OS how to run the script when invoked directly on the commandline. (It's ignored on Windows, which only looks at the file extension.)
#!/usr/bin/perl
use v5.16.0;
use warnings;
say "Hello world";
chmod a+x myscript.pl
./myscript.pl
But there isn't one right answer for what the shebang should be. /usr/bin/perl
may be commonly available, but not always, and may not be the perl
the user prefers.
For Perl scripts that are distributed to users to run how they wish, use env
to run the perl
that comes first in PATH:
#!/usr/bin/env perl
Perl scripts distributed on CPAN, however, get installed to a specific perl
with their dependencies, so their shebang must also point to that perl
. This is handled by a shebang rewrite step in the installation process, but it doesn't work for an env
shebang for historical reasons.
For Perl scripts distributed via CPAN installation, you can use any single-word shebang that ends in perl
, even just perl
:
#!perl
While developing and testing, the shebang will not have been rewritten yet, so you can invoke it as perl script/myscript.pl
to run it with your preferred perl
and ignore the shebang. If the script depends on modules in lib/
in the same distribution, it is common to run it during development as perl -Ilib script/myscript.pl
.
Finally, when you deploy and install a script manually, it should be run with a specific perl
so that it doesn't suddenly start running with a different perl
from the one it was deployed for, which may not have the script's dependencies installed or may behave subtly differently.
For Perl scripts deployed to a specific location, use the full path to the perl
that should run it on that machine:
#!/usr/bin/perl
#!/opt/perl/bin/perl
#!/home/user/perl5/perlbrew/perls/perl-5.34.0/bin/perl
#!/home/user/.plenv/versions/5.34.0/bin/perl
You may also find Perl scripts with flags specified in the shebang with hyphens. This doesn't work with env
shebangs in many cases, but the two common flags used this way are -w
for warnings and -T
for taint mode. -w
is unnecessary and discouraged; just use warnings;
instead.