in reply to UNIX environment setup via perl

To all monks who proposed the "export ..." and "eval ..." way: do not forget the csh and tcsh users! You should check for $ENV{SHELL} and emit "setenv VAR VALUE" lines if appropriate.

Replies are listed 'Best First'.
Re: Re: UNIX environment setup via perl
by haoess (Curate) on May 07, 2004 at 16:22 UTC
    > You should check for $ENV{SHELL} and emit "setenv VAR VALUE"
    > lines if appropriate.

    $ENV{SHELL} is not a way to determine your current shell. $ENV{SHELL} is your »preferred shell« (aka login shell in /etc/passwd), see The Single UNIX Specification, Version 3.

    Example:

    # we are in bash, all is fine $ eval `perl -le 'print $ENV{SHELL} =~ /csh/ ? "setenv FOO bar" : "exp +ort FOO=bar"'` # now we switch to tcsh $ tcsh $ eval `perl -le 'print $ENV{SHELL} =~ /csh/ ? "setenv FOO bar" : "exp +ort FOO=bar"'` $ export: Command not found. $ echo $SHELL /bin/bash

    It seems that there is no portable way to find out the name of your current shell. We discussed that some time ago at de.comp.os.unix.shell.

      Looking at $ENV{SHELL} is probably the best we can do --- other programs seem to do it the same way (and therefore do it wrong):
      $ env SHELL=/bin/sh ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XXN54U4g/agent.3950; export SSH_AUTH_SOCK; SSH_AGENT_PID=3951; export SSH_AGENT_PID; echo Agent pid 3951;
      $ env SHELL=/bin/tcsh ssh-agent setenv SSH_AUTH_SOCK /tmp/ssh-XXPC7hgb/agent.3948; setenv SSH_AGENT_PID 3949; echo Agent pid 3949;
      Similar output for /usr/X11/bin/resize