in reply to Perl script runs fine if exec'd from the directory, but gives error if run outside the directory.

it runs fine if I execute it from within the directory where it's located ... However, running it by giving the path gives the following error

This, coupled with the fact you've got relative pathnames in your script, is the very first thing I would fix. You need to have an absolute pathname somewhere, relative to which the filenames should be resolved. It either needs to be hardcoded, in a configuration file whose location is fixed, given by the user, or you can get pathnames relative to the current script's location like so:

use warnings; use strict; use FindBin; use File::Spec::Functions qw/catfile/; use Config::Tiny; my $config_file = catfile($FindBin::Bin, 'vnxe_config.conf'); my $array_creds = Config::Tiny->read($config_file) or die "Failed to read $config_file";

Note how you don't need to call ->new if you're also calling ->read, and note how I added a check to make sure ->read isn't returning undef (for example, if it can't find the file). You'll need to use this method of getting an absolute pathname for every filename that you don't want to be resolved relative to the current working directory.

If you still have the same issue after doing this, please let us know.

  • Comment on Re: Perl script runs fine if exec'd from the directory, but gives error if run outside the directory.
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Perl script runs fine if exec'd from the directory, but gives error if run outside the directory.
by pritesh_ugrankar (Monk) on Oct 02, 2020 at 19:32 UTC

    Hi Haukex,

    Thank you so much for the clarification. I'm the same guy you helped with your fantastic answer earlier. I have used your module and slightly modified version of your code in this script. Thank you once again.

      I have used your module

      Glad to help. Note IPC::Run3 isn't my module (IPC::Run3::Shell, which uses that module, is). By the way, in the comments in the OP you mention DRY, and this is definitely a case where it applies. Here's how I might have coded this in order to avoid as much of the repetition as possible:

      my @commands = ( { name=>'genhealth', arg=>'/sys/general', file=>'genhealthfile' }, { name=>'bat', arg=>'/env/bat', file=>'batteries' }, # ... { name=>'ssd', arg=>'/env/ssd', file=>'ssd_file' }, ); for my $cmd (@commands) { print "### Working on ", $cmd->{name}, "\n"; run3 ['uemcli', '-d', $vnxe_ip, '-u', $username, '-p', $password, $cmd->{arg}, 'show', '-detail'], undef, \my $out; my $str = decode('UTF-16', $out, Encode::FB_CROAK); my $filename = $cmd->{file}.'.txt'; open (my $fh, '>', $filename) or die "$filename: $!"; print $fh $str; close $fh; }

      Update: By the way, I don't know why you are using file mode '+>', since that's only needed for R/W access, it seems to me '>' should be enough for your case. Beware of cargo-culting!

        Hi Haukex,

        How you guys are able to write this elegant and mind opening stuff on the fly is beyond me. Hope one day I will reach there. Thank you once again for this. You are all generous and quite helpful.