#!/usr/bin/env perl ## envstore - save and load environment variables ## Copyright © 2009 by Daniel Friesel ## License: WTFPL use strict; use warnings; my $store_file = "/tmp/.envstore-$>"; my %store; my $action = shift; my $arg = shift; my $arg2 = shift; my ($key, $value); sub usage { print STDERR "Usage: envstore \n"; print STDERR " envstore save [value]\n"; print STDERR " envstore rm \n"; exit(1); } sub check_store { my ($mode, $uid); unless (-e $store_file) { return(0); } ($mode, $uid) = (stat($store_file))[2,4]; $mode &= 0x00077; if ($uid != $<) { print STDERR "envstore: store file not owned by us\n"; exit(1); } if ($mode > 0) { print STDERR "envstore: store file writable by group/others\n"; exit(1); } return(1); } sub load_store { my ($key, $value); return unless check_store; open(my $handle, '<', $store_file) or die("Cannot read $store_file: $!"); while (<$handle>) { chomp; /^(\S+)\s+(.*)$/ or next; ($key, $value) = ($1, $2); $store{$key} = $value; } close($handle); } sub save_store { my $key; umask(0077); open(my $handle, '>', $store_file) or die("Cannot open $store_file: $!"); foreach $key (keys(%store)) { print $handle "$key\t$store{$key}\n"; } close($handle); } sub get_keyvalue { my ($key, $value) = @_; unless (defined($value)) { if (exists($ENV{$key})) { $value = $ENV{$key}; } else { print STDERR "No such parameter: $key\n"; exit(1); } } return($key, $value); } usage unless defined($action); load_store; if ($action eq 'save') { usage unless defined($arg); ($key, $value) = get_keyvalue($arg, $arg2); $store{$key} = $value; save_store; } elsif ($action eq 'eval') { while (($key, $value) = each(%store)) { $value =~ s/'/'"'"'/g; print "export $key='$value'\n"; } } elsif ($action eq 'show' or $action eq 'list') { while (($key, $value) = each(%store)) { printf("%-15s = %s\n", $key, $value); } } elsif ($action eq 'rm') { usage unless defined($arg); delete($store{$arg}); save_store; } elsif ($action eq 'clear') { unlink($store_file); } else { usage; } __END__ =head1 NAME envstore - save and restore environment variables =head1 SYNOPSIS B I [ I ] =head1 DESCRIPTION envstore can safe and restore environment variables, thus transferring them between different shells. I must be one of =over =item B Forget all stored variables =item B Produce shell code for evaluation, restoring all saved variables =item B I [I] Save I either with it's current shell value or with I =item B List saved variables in better readable format =item B I Remove I from store =back