Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: OS independent perl script

by DrHyde (Prior)
on Feb 21, 2014 at 11:21 UTC ( #1075725=note: print w/replies, xml ) Need Help??


in reply to OS independent perl script

The hardest bit IMO isn't writing the perl code, it's making it executable on all the bizarro platforms that perl runs on. That is, to get the #! line right on Unix-a-likes, but make it a valid .BAT file on Windows, and whatever is needed on VMS.

Thankfully, there's a tool to do that.

ExtUtils::MakeMaker and, presumably, Module::Build, have the smarts to edit your scripts appropriately at install time so you don't have to worry about it. If for some reason you can't use either of those tools, then the maximally portable preamble for Unix-a-likes is:

#!/bin/sh exec perl -x $0 "$@" #!perl # your perl code goes here

but I have no idea what to do, or even if you can, make that also portable to other platforms.

Replies are listed 'Best First'.
Re^2: OS independent perl script
by Corion (Pope) on Feb 21, 2014 at 11:46 UTC

    For Windows, there is a really simple .cmd file that I use to launch a plain Perl script with the same name:

    @echo off perl -w %~dpn0.pl

    For a file test.cmd, this will launch perl -w test.pl in the same directory as test.cmd.

      Is %~dpn0 some bizarro shell magic then?

        Yep.

        %0 corresponds to $0, and the magic letters behind the tilde are explained (for example) here.

        See also  help for and Re: Command line arguments not passed in Win7 ( regqueryperl.bat ), Question on Strawberry's Portable .bat file

        @setlocal @set thisdir=%~dp0 @set thisfile=%~f0 @set thisfilebasename=%~n0 @set thisfilename=%~nx0 @set thisfilecorion=%~dpn0.pl @set thisfilepl=%thisdir%%thisfilebasename%.pl @echo thisdir=%thisdir% @echo thisfile=%thisfile% @echo thisfilebasename=%thisfilebasename% @echo thisfilename=%thisfilename% @echo thisfilecorion=%thisfilecorion% @echo thisfilepl=%thisfilepl% @echo; @endlocal

        thisdir=D:\ thisfile=D:\this2.bat thisfilebasename=this2 thisfilename=this2.bat thisfilecorion=D:\this2.pl thisfilepl=D:\this2.pl

        And the advanced broken version (for stupid paths )
        ^ is trickier than the others ... above escaping useful for example if you're  echo %stuff% >> otherfile.bat
        yes, cmd.exe is a mess

        @setlocal @set "thisdir=%~dp0" @set "thisfile=%~f0" @set "thisfilebasename=%~n0" @set "thisfilename=%~nx0" @set "thisfilecorion=%~dpn0.pl" @set "thisfilepl=%thisdir%%thisfilebasename%.pl" @echo thisdir="%thisdir% @echo thisfile="%thisfile% @echo thisfilebasename="%thisfilebasename% @echo thisfilename="%thisfilename% @echo thisfilecorion="%thisfilecorion% @echo thisfilepl="%thisfilepl% @echo; @set "thisfile=%~f0" echo %thisfile% @set "thisfile=%thisfile:^=\^%" @set "thisfile=%thisfile:>=^>%" @set "thisfile=%thisfile:<=^<%" @set "thisfile=%thisfile:&=^&%" @set "thisfile=%thisfile:|=^|%" @set "thisfile=%thisfile:)=^)%" @set "thisfile=%thisfile:(=^(%" @set "thisfile=%thisfile:[=^[%" @set "thisfile=%thisfile:]=^]%" @set "thisfile=%thisfile:"=\"%" @echo escaped-thisfile "%thisfile%" @echo; @endlocal

        $ "D:\pa^th\this2.bat" thisdir=D:\path\ thisfile=D:\path\this2.bat thisfilebasename=this2 thisfilename=this2.bat thisfilecorion=D:\path\this2.pl thisfilepl=D:\path\this2.pl

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1075725]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2019-08-19 08:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If you were the first to set foot on the Moon, what would be your epigram?






    Results (138 votes). Check out past polls.

    Notices?