For a long time, I've been looking for a solution to bring Mac, Windows and Linux behaviour closer. My use case : I work in a corporate Windows environment (where you don't want to install unecessary software), but still would like a friendly CLI (I'm not great at it).

I use UnxUtils, BusyBox-w32 and other utils to have a bearable experience on Windows, but they don't provide the same features/options as you'll find on macOS or Linux. Then I heard about the PerlPowerTools and thought they'd be perfect for having the same behaviour across these platforms. Even though I somehow find them hard to use due to namespace conflict with system utilities.

So, I've updated (my fork of) the PerlPowerTools to behave like BusyBox and bundle them (with PAR::Packer) as a single Windows executable.

Result : You can call the tools similarly on all three platforms.

bin/cat bin/perlpowertools cat packed/perlpowertools.exe cat packed/cat.exe

The additional benefit is that I can complement my Windows toolbox with my own (Perl) scripts. For example, add ack! to perlpowertools.exe just by copying the singl e-file version to PerlPowerTools's bin directory and running the 'packer' script.

Any feedback, beta-testing or else are welcomed.

https://github.com/kal247/PerlPowerTools

Replies are listed 'Best First'.
Re: PerlPowerTools as single Windows executable
by stevieb (Canon) on May 26, 2022 at 21:42 UTC

    Can you please provide some examples of how your work is executed, and what its results are? ie. Show us what it does?

      Well, I'm afraid there's not much to show, but here are the 3 parts :

      1. The script 'util/packer' calls PAR::Packer 'pp' to bundle all tools (and POD) as 'PerlPowerTools.exe' :

      # build packed executable system( "pp", "-v", "-I", "lib", # include PerlPowerTools.pm, used for $VERSION "-F", $podstrip, # apply PodStrip but keep PerlPowerTools doc "-a", "$podfile;$packedpodfile", # include perldoc doc "-o", "$ppt_dir/packed/perlpowertools.exe", @tools ) == 0 or die "system failed: $?";

      2. The "fake" tool '~/perlpowertools/bin/perlpowertools' is a frontend/dispatcher to execute the tool supplied as first argument, either from '~/perlpowertools/bin' or from the (extracted) bundle :

      my $ppt_bin = defined $ENV{PAR_TEMP} ? "$ENV{PAR_TEMP}/inc/script" : d +irname(abs_path($0)); ... my $file = "$ppt_bin/$tool"; $0 = $tool; # for usage/warning/error messages my $return = do $file;

      3. The "fake" tool '~/perlpowertools/bin/perldoc' is the real perldoc, but with a custom search path to find POD in '~/perlpowertools/bin' or in the (extracted) bundle :

      # let perldoc also search in perlpowertools bin unshift @INC, dirname(abs_path(__FILE__));