diff options
Diffstat (limited to 'lib/dotsh.pl.art')
-rw-r--r-- | lib/dotsh.pl.art | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/lib/dotsh.pl.art b/lib/dotsh.pl.art deleted file mode 100644 index 4f0f188e3c..0000000000 --- a/lib/dotsh.pl.art +++ /dev/null @@ -1,154 +0,0 @@ -Article 19995 of comp.lang.perl: -Newsgroups: comp.lang.perl -Path: netlabs!news.cerf.net!mvb.saic.com!MathWorks.Com!europa.eng.gtefsd.com!howland.reston.ans.net!news.ans.net!malgudi.oar.net!chemabs!skf26 -From: skf26@cas.org (Scott Frost) -Subject: HOW TO source shell scripts into Perl -Message-ID: <1994Mar21.191518.11636@chemabs.uucp> -Followup-To: scott.frost@cas.org -Keywords: Shell, Source, Dot -Sender: usenet@chemabs.uucp -Organization: Chemical Abstracts Service -Date: Mon, 21 Mar 1994 19:15:18 GMT -Lines: 139 - -A few days ago I posted a request for information on how to source -a shell script into a perl script. In general, the responses indicated that -it could not be done (although one came pretty close to the actual solution). - -A fellow staff member (who I was posting the request for) wasn't satisfied with -the response and came up with a way. - -Before I indicate how he solved the problem, let me suggest some alternative -methods of resolving this issue, - - 1. Hard code the environment variables directly in your PERL script. This - is easy but unreliable. System administrators could change the - production shell script environment variables and your PERL script would - be hosed. - - 2. Create a shell wrapper that dots the shell script into your current - environment and then invoke your perl script. This approach is easy - to do, fairly full proof, but an affront to serious PERL programmers - who believe PERL is God's gift to man (or at least Larry's :-) ). - -Chuck's solution involves running the script in the appropriate shell -environment, dumping the shell's environment variables to a file, and then -reading the environment variables into PERL's environment. - -It supports ksh, sh, csh, and zsh shells. It'll look at the first line of -the file to be executed to determine the shell to run it under, if not found, -it'll look at the SHELL environment variable. If the shell is not one of the -four listed, it'll warn you and attempt to run the shell script under /bin/sh. - - A typical usage might look like this, - #!/usr/bin/perl - - # Make sure dotsh.pl is placed in your /usr/perl/lib - require "dotsh.pl"; - - print "SHELL_ENV_VAR = $SHELL_ENV_VAR\n" ; - &dotsh('/tmp/foo') ; # script to run - print "SHELL_ENV_VAR = $SHELL_ENV_VAR\n" ; - - /tmp/foo looks like this: - #!/bin/ksh - export SHELL_ENV_VAR="hi mom" - -The actual dotsh.pl script follows (BTW, this is now public domain): -# -# @(#)dotsh.pl 03/19/94 -# -# Author: Charles Collins -# -# Description: -# This routine takes a shell script and 'dots' it into the current perl -# environment. This makes it possible to use existing system scripts -# to alter environment variables on the fly. -# -# Usage: -# &dotsh ('ShellScript', 'DependentVariable(s)'); -# -# where -# -# 'ShellScript' is the full name of the shell script to be dotted -# -# 'DependentVariable(s)' is an optional list of shell variables in the -# form VARIABLE=VALUE,VARIABLE=VALUE,... that 'ShellScript' is -# dependent upon. These variables MUST be defined using shell syntax. -# -# Example: -# &dotsh ('/tmp/foo', 'arg1'); -# &dotsh ('/tmp/foo'); -# &dotsh ('/tmp/foo arg1 ... argN'); -# -sub dotsh { - local(@sh) = @_; - local($tmp,$key,$shell,*dotsh,$command,$args,$vars) = ''; - $dotsh = shift(@sh); - @dotsh = split (/\s/, $dotsh); - $command = shift (@dotsh); - $args = join (" ", @dotsh); - $vars = join ("\n", @sh); - open (_SH_ENV, "$command") || die "Could not open $dotsh!\n"; - chop($_ = <_SH_ENV>); - $shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/); - close (_SH_ENV); - if (!$shell) { - if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/csh$/) { - $shell = "$ENV{'SHELL'} -c"; - } else { - print "SHELL not recognized!\nUsing /bin/sh...\n"; - $shell = "/bin/sh -c"; - } - } - if (length($vars) > 0) { - system "$shell \"$vars;. $command $args; set > /tmp/_sh_env$$\""; - } else { - system "$shell \". $command $args; set > /tmp/_sh_env$$\""; - } - - open (_SH_ENV, "/tmp/_sh_env$$") || die "Could not open /tmp/_sh_env$$!\n"; - while (<_SH_ENV>) { - chop; - /=/; - $ENV{$`} = $'; - } - close (_SH_ENV); - system "rm -f /tmp/_sh_env$$"; - - foreach $key (keys(ENV)) { - $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/; - } - eval $tmp; -} -1; - - - - - - - - - - - - - - - - - - - - - - - - - - --- -Scott K. Frost INET: scott.frost@cas.org - - |