use strict; sub get_bash_login_env { local %ENV; my $env = `echo env | bash --login`; if (wantarray) { $env =~ s/\\(.)/$1/gs; return map {split /=/, $_, 2} map {split /\n/, $_} $env; } else { return $env; } } # And a demo of how to use it use Data::Dumper; %ENV = (%ENV, get_bash_login_env()); print Dumper(\%ENV);