#!/usr/bin/perl # xenv: defines XMLterm environment variables # Usage: xenv [-s|--shell] use Getopt::Long; Getopt::Long::config('bundling'); &GetOptions("shell|s=s", "help|h"); if ($opt_help) { print "Usage: xenv [-s ]\n"; exit; } my $shell = $ENV{SHELL}; $shell = $opt_shell if $opt_shell; my $cshell = 0; $cshell = 1 if ($shell =~ /csh$/); $| = 1; # Flush output cbreak(); # Raw (noecho) mode print STDERR "\033{A\n"; # Send escape sequence on STDERR my $key = ''; my $param_str = ""; my $bytes = sysread(STDIN, $key, 1); while ($bytes && ($key ne "\n")) { $param_str .= $key; $bytes = sysread(STDIN, $key, 1); } cooked(); # Cooked mode my @params = split /;/, $param_str; foreach my $param (@params) { if ( $param =~ /^(\w+)=(.*)$/ ) { my ($name, $value) = ($1, $2); if ($cshell) { print "setenv $name $value;\n"; } else { print "$name=$value; export $name;\n"; } } } exit; BEGIN { use POSIX qw(:termios_h); my ($term, $oterm, $echo, $noecho, $fd_stdin); $fd_stdin = fileno(STDIN); $term = POSIX::Termios->new(); $term->getattr($fd_stdin); $oterm = $term->getlflag(); $echo = ECHO | ECHOK | ICANON; $noecho = $oterm & ~$echo; sub cbreak { $term->setlflag($noecho); $term->setcc(VTIME, 1); $term->setattr($fd_stdin, TCSANOW); } sub cooked { $term->setlflag($oterm); $term->setcc(VTIME, 0); $term->setattr($fd_stdin, TCSANOW); } } END { cooked() }