EchoAngel has asked for the wisdom of the Perl Monks concerning the following question:

Hello, I was programming like crazy in perl and some where in my code i had system("cd errors/crd"); # then some code to open a file in there/ in that directory system("cd ../.."); # continue on with my code and none of this work! why? how do i fix this? I know the file exist in that folder and it didn't read it in.

Replies are listed 'Best First'.
Re: why my system call won't work?
by matija (Priest) on Jun 12, 2004 at 17:04 UTC
    The system call creates a subprocess. That subprocess changes it's current directory - but then it exits. You can't run cd in a subprocess and have it affect the parent - it would be a big security hole.

    What you can do is run Perl's builtin chdir. That will do what you want.

Re: why my system call won't work?
by SciDude (Friar) on Jun 12, 2004 at 18:07 UTC

    I recently needed to store some SKU information in a subdirectory. This is the simple example I arrived at. More experienced Monks are welcome to tear this apart with improvement suggestions:

    #!/usr/bin/perl -w use strict; use Storable; use Data::Dumper; use Cwd; # Note it is possible to override chdir to update $ENV{PWD} +but I could not get it to work under strict my $dir; my $cwd = cwd; my %skuname = ( Lots of stuff here ) # Hard coded data to store in sub +directory # Where are we in working directory now? print "Current Directory by cwd is $cwd \n"; print "Current Directory by env is ", $ENV{'PWD'} , "\n"; # Lets take that info and create a new current working directory print "Appending skudbcurrent to dir\n"; $dir = $cwd . "/skudbcurrent"; print "We wish to move to $dir "; # This directory may or may not exist print "Checking to see if skudbcurrent exists, if not then create +it\n"; unless (-d $dir) { mkdir $dir; print "We had to make $dir \n"; }; # We created it if it was not already there so now move into it # Note that cwd chdir and $ENV{'PWD'} get out of sync although the mov +e was successful chdir $dir; #move into the new directory print "Moved to new directory:",$ENV{'PWD'} , "\n"; print "Which should match $dir\n"; # We made the move. Now store some data in the new location. store(\%skuname, 'skudb') or die "Can't store %a in new location!\ +n"; # Success! Now print out what we think was stored print "Done!\n"; print "Saved the file! er following:\n"; print Dumper( \%skuname );

    I hope this brief example is useful for you.


    SciDude
    The first dog barks... all other dogs bark at the first dog.

      Cwd::chdir() works fine with strict. Did you import chdir? Even if you didn't, I don't see how that would annoy stricture.

      $ cd $ perl -Mstrict -Mwarnings -MCwd=chdir -e'chdir "src"; print $ENV{"PWD +"}, $/' /home/zaxo/src $

      After Compline,
      Zaxo

        hrmmm....so for what I want: i should do chdir "error/srd"; then chdir; ?