in reply to .env loading the dot env file?

See Get default login environment and the discussion therein. There is Shell::EnvImporter.

I'm not sure if you really want the effects of a shell script, or just something that "looks like sh environment commands". If so, your approach seems good, but doesn't respect quoted constructs.

In your code, I would at least change the split() to a more robust parser, so that it also understands foo=bar=baz as setting foo to bar=baz:

#my ($key, $value) = split /\s*=\s*/, $line; if( $line =~ /^\s*([^=]+)=(.*?)\s*$/ ) { my ($key,$value) = ($1,$2); $ENV{$key} = $value; } else { croak "Malformed environment line: '$line'"; };

Support for foo="bar=baz" and foo=\"bar=baz\" would also be addable, but if you want to support multiline values, you'll have to switch away from line-based parsing.

Updated: The capturing parentheses were missing for the key, spotted by Anomalous Monk