------------------------------------------------
On Wed, 15 Jan 2003 12:55:39 -0500, Mark Goland <[EMAIL PROTECTED]> wrote:

> Hello Perl lovers,
> 
>  I am developing a script which runs in TCSH 6.x shell. I have two questions
> 

Remember your script runs in Perl not in the shell, you run the perl interpreter in 
the shell, and I believe Perl uses whatever shell is default on the system for how to 
run its "system" calls, aka most likely /bin/sh (which could be pointed to tcsh, but 
may not).

> 1.  I need to be able to set an global enviernment variable. The shell has a
> build in command setenv which would enable me to do what I need. This is
> what I try,
> 
> system("setenv DESTDIR /mnt");
> 

This is most likely succeeding (assuming the shell accepts it all) but I would imagine 
the shell is started, the command is run, and the shell is closed. So your subsequent 
call to the shell will be invoked in a new instance of the environment, without what 
you set. But it appears there is no reason to use this, at least not in this code 
segment, see below.


> ...but this fails , by hand in works great. Source has the same problme. Any
> ideas ???
> 
> 2. I need to run a few external commands sequantialy. Run one  wait on it to
> compleate run the others.... a sample command would be
> 
> system("cat cab.??|tar vxz -C ${DESTDIR}");

Here your "${DESTDIR}" is being interpolated to use perl's DESTDIR variable instead of 
the shell's.  Is this what you intended (is it even set, are you running with strict 
and warnings?)  Other than that it should be working I believe.  Are you getting an 
error result? You should check for one by adding an 'or die ("Couldn't tar files: 
$!")' or some such to the system call, or check the return value ($?).

> 
>  In C I would usually fork and waitpid on child, I was wondering if there is
> a short trick to this in Perl. ( I know IPC::OpenX returns pid and I can do
> a waitpid on it ) .
> 

How do you mean "short trick" ... it seems IPC::OpenX would be the short trick, the 
normal way will work as you mentioned, to fork, and then waitpid on that child, of 
course within that fork you are probably still looking at doing a 'system'.  'system' 
just encapsulates the fork/waitpid process for you, so you don't gain anything by 
first forking. To maintain the shell's environment if this can't be handled in Perl, 
you may be able to string commands together in one command to system separated by ;'s 
like on the command line, but this I am not sure about.

HTH a little, Good luck...

http://danconia.org

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to