Sponsored Content
Top Forums Shell Programming and Scripting Problems with Perl/KSH Web Log Script Post 302072457 by cbkihong on Wednesday 3rd of May 2006 06:26:05 AM
Old 05-03-2006
EDIT: It is nice that you figured out what went wrong. My original response follows, which describes another possibility within perl (although it turned out that you don't fall in that case).

--------------------------------------------------------------------------------------

This is in fact a BIG question.

This is a symptom that the script is not well written because it relies on being invoked from a certain working directory. This is a common problem that many scripts may work on the command line but refuse to run with cron, for instance, as the working directory is different from norm.

There is no easy fix to this problem if the script is written without the sense of such relocation in mind. A quick fix is by some simple compound command which "cd" and then execute the script (that you can always write a script to automate these two steps).

If you want to fix this permanently, you must examine the script line by line for all references with relative paths. They may occur as two major classes:

1. Operations depending on the Perl include path
2. File open() and external shell commands

The Perl include path (@INC) holds the list of directories to search for libraries (used by "require" and "use"). Make sure the dirs listed cover all the paths needed by your require() statements. If any of the items listed denote relative path, change them to use absolute paths. Normally, @INC includes '.', so the current working directory is taken into account.

Other file operations also depend on current working directory in case of relative paths are used. Without '/' prefix, all paths are relative to CWD. For instance,

open FILE, ">>file.txt";
`diff file1.txt file2.txt`

These two classes of relative paths should generally be treated separately, because they are of different nature. Perl @INC is for resolving external Perl scripts, they should not normally be subject to changes in CWD. However, at other times you may actually wish to honour the CWD in certain cases. For instance, in a build script one may wish to have compiled object binaries placed outside of the original source tree, so we will change the CWD to outside the tree and have everything generated dropped in that directory.

However, in really big scripts nobody wants to hardcode an absolute path everywhere (for portability/management sake as well). It is therefore common practice to have a single file that acts as a "configuration file" that defines all these paths in a centralized manner. The @INC is initialized at the start of the script based on the contents of this file. But then, how to locate this file? Either it is placed at a fixed location, or you may actually deduce dynamically the base directory of the current script file with something like

use File::Spec;
dirname(File::Spec->rel2abs(__FILE__))

as an aid to construct absolute paths from relative paths. If all of the paths are constructed without implicit use of relative paths, your script will then be independent of the CWD.

Tedious enough. Isn't it?
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

having ksh script problems

well i have written a script to telnet and ftp to all my servers, the script runs great, BUT i can not for the life of me figure out how to get the script to repeat if the conditions are not filled. this is what i have so far ######################################### TorF(){ echo T... (4 Replies)
Discussion started by: jerzey4life
4 Replies

2. UNIX for Dummies Questions & Answers

Web Server - uploading Frontpage web - will there be problems??

hiya All, New to this Web site stuff. Will be installing Fedora's latest O/S (including Apache) - onto a spare PC Then... Gulp... setting up a Web server. Designing a Web site using WINDOWS FRONT PAGE 2002: * Simply easiest/quickiest way to knock up a basic site. * There won't be... (6 Replies)
Discussion started by: marty 600
6 Replies

3. Shell Programming and Scripting

Problems in running a Perl script via cronjob

I have a very basic perl script that attempts to find if a process is running. If the process is not running then the script is supposed to start the process. If I execute the script from command line it works fine as expected. However if the script is executed via cronjob, the script cannot find... (1 Reply)
Discussion started by: ypant
1 Replies

4. Shell Programming and Scripting

autosys/ksh - problems with script

Hi, I'm using autosys and want to set it up that I receive emails when certain jobs start and finish. I don't want to edit each jobs script (ksh) to send a mail at start and finish, I would rather have a single script/job that watches for a trigger when the jobs have started or finished. I... (1 Reply)
Discussion started by: weszardoz
1 Replies

5. UNIX for Dummies Questions & Answers

Downloading file from web using perl script

Hi experts, I've question in perl, i need to download a text file from the Web and save that content to the server, Is it possible in perl script or i need to do it in the excel. I tried in the excel but the alignment is missing there. Could you please help in find that. Thanks senthilkumar (0 Replies)
Discussion started by: senthil.ak
0 Replies

6. Shell Programming and Scripting

Perl script to copy contents of a web page

Hi All, Sorry to ask this question and i am not sure whether it is possible. please reply to my question. Thanks in advance. I need a perl script ( or any linux compatible scripts ) to copy the graphical contents of the webpage to a word pad. Say for example, i have a documentation site... (10 Replies)
Discussion started by: anand.linux1984
10 Replies

7. Shell Programming and Scripting

Perl Print Problems in script

Hi Perl Gurus, perl -e 'print "http://www.site@domain.com"' The output of the above is : http://www.site.com" I want to print http://www.site@domain.com without using escape sequence before '@' like '\@'. Is there any way to do this in perl? Thanks, Som (1 Reply)
Discussion started by: som.nitk
1 Replies

8. Shell Programming and Scripting

Perl Script to find & copy words from Web.

I need to write a perl script to search for a specific set of numbers that occur after a series of words but before another. Specifically, I need to locate the phrase today at the summit, then immediately prior to the words tonnes/day copy the number that will be between 100 and 9,999, for example,... (1 Reply)
Discussion started by: libertyforall
1 Replies

9. Shell Programming and Scripting

shell script to call perl script problems

Ok, don't ask me why, but all calls to perl must be called by a shell script. Its really not ideal, but its what I have to work with. Calling it isnt the issue, its passing in the arguments. I have about 1000 perl scripts to call by a shell script. Right now, I'm executing the shell script... (3 Replies)
Discussion started by: regexnub
3 Replies

10. Shell Programming and Scripting

Web Automation in Perl/Ksh with NO additional modules

I would like to automate form filling in a remote way... i mean in the background. That form consists of 3 pages (need to be traversed by clicking on a "next" button). Form uses JavaScript as well. The scripts I have access to are perl/Unix shells I google'd and found that in perl it can be... (0 Replies)
Discussion started by: dahlia84
0 Replies
File::chdir(3pm)					User Contributed Perl Documentation					  File::chdir(3pm)

NAME
File::chdir - a more sensible way to change directories VERSION
version 0.1006 SYNOPSIS
use File::chdir; $CWD = "/foo/bar"; # now in /foo/bar { local $CWD = "/moo/baz"; # now in /moo/baz ... } # still in /foo/bar! DESCRIPTION
Perl's "chdir()" has the unfortunate problem of being very, very, very global. If any part of your program calls "chdir()" or if any library you use calls "chdir()", it changes the current working directory for the whole program. This sucks. File::chdir gives you an alternative, $CWD and @CWD. These two variables combine all the power of "chdir()", File::Spec and Cwd. $CWD Use the $CWD variable instead of "chdir()" and Cwd. use File::chdir; $CWD = $dir; # just like chdir($dir)! print $CWD; # prints the current working directory It can be localized, and it does the right thing. $CWD = "/foo"; # it's /foo out here. { local $CWD = "/bar"; # /bar in here } # still /foo out here! $CWD always returns the absolute path in the native form for the operating system. $CWD and normal "chdir()" work together just fine. @CWD @CWD represents the current working directory as an array, each directory in the path is an element of the array. This can often make the directory easier to manipulate, and you don't have to fumble with "File::Spec->splitpath" and "File::Spec->catdir" to make portable code. # Similar to chdir("/usr/local/src/perl") @CWD = qw(usr local src perl); pop, push, shift, unshift and splice all work. pop and push are probably the most useful. pop @CWD; # same as chdir(File::Spec->updir) push @CWD, 'some_dir' # same as chdir('some_dir') @CWD and $CWD both work fine together. NOTE Due to a perl bug you can't localize @CWD. See "BUGS and" for a work around. EXAMPLES
(We omit the "use File::chdir" from these examples for terseness) Here's $CWD instead of "chdir()": $CWD = 'foo'; # chdir('foo') and now instead of Cwd. print $CWD; # use Cwd; print Cwd::abs_path you can even do zsh style "cd foo bar" $CWD = '/usr/local/foo'; $CWD =~ s/usr/var/; if you want to localize that, make sure you get the parens right { (local $CWD) =~ s/usr/var/; ... } It's most useful for writing polite subroutines which don't leave the program in some strange directory: sub foo { local $CWD = 'some/other/dir'; ...do your work... } which is much simpler than the equivalent: sub foo { use Cwd; my $orig_dir = Cwd::abs_path; chdir('some/other/dir'); ...do your work... chdir($orig_dir); } @CWD comes in handy when you want to start moving up and down the directory hierarchy in a cross-platform manner without having to use File::Spec. pop @CWD; # chdir(File::Spec->updir); push @CWD, 'some', 'dir' # chdir(File::Spec->catdir(qw(some dir))); You can easily change your parent directory: # chdir from /some/dir/bar/moo to /some/dir/foo/moo $CWD[-2] = 'foo'; CAVEATS
Assigning to @CWD calls "chdir()" for each element @CWD = qw/a b c d/; Internally, Perl clears @CWD and assigns each element in turn. Thus, this code above will do this: chdir 'a'; chdir 'a/b'; chdir 'a/b/c'; chdir 'a/b/c/d'; Generally, avoid assigning to @CWD and just use push and pop instead. "local @CWD" does not work. "local @CWD>" will not localize @CWD. This is a bug in Perl, you can't localize tied arrays. As a work around localizing $CWD will effectively localize @CWD. { local $CWD; pop @CWD; ... } Volumes not handled There is currently no way to change the current volume via File::chdir. NOTES
$CWD returns the current directory using native path separators, i.e. on Win32. This ensures that $CWD will compare correctly with directories created using File::Spec. For example: my $working_dir = File::Spec->catdir( $CWD, "foo" ); $CWD = $working_dir; doing_stuff_might_chdir(); is( $CWD, $working_dir, "back to original working_dir?" ); Deleting the last item of @CWD will act like a pop. Deleting from the middle will throw an exception. delete @CWD[-1]; # OK delete @CWD[-2]; # Dies What should %CWD do? Something with volumes? # chdir to C:Program FilesSierraHalf Life ? $CWD{C} = '\Program Files\Sierra\Half Life'; DIAGNOSTICS
If an error is encountered when changing $CWD or @CWD, one of the following exceptions will be thrown: o Can't delete except at the end of @CWD o Failed to change directory to '$dir' HISTORY
Michael wanted "local chdir" to work. p5p didn't. But it wasn't over! Was it over when the Germans bombed Pearl Harbor? Hell, no! Abigail and/or Bryan Warnock suggested the $CWD thing (Michael forgets which). They were right. The "chdir()" override was eliminated in 0.04. David became co-maintainer with 0.06_01 to fix some chronic Win32 path bugs. As of 0.08, if changing $CWD or @CWD fails to change the directory, an error will be thrown. SEE ALSO
File::pushd, File::Spec, Cwd, "chdir" in perlfunc, "Animal House" <http://www.imdb.com/title/tt0077975/quotes> SUPPORT
Bugs / Feature Requests Please report any bugs or feature requests by email to "bug-file-chdir at rt.cpan.org", or through the web interface at <http://rt.cpan.org/Public/Dist/Display.html?Name=File-chdir>. You will be automatically notified of any progress on the request by the system. Source Code This is open source software. The code repository is available for public review and contribution under the terms of the license. <https://github.com/dagolden/file-chdir> git clone https://github.com/dagolden/file-chdir.git AUTHORS
o David A Golden <dagolden@cpan.org> o Michael G Schwern <schwern@pobox.com> (original author) COPYRIGHT AND LICENSE
This software is copyright (c) 2011 by Michael G Schwern and David A Golden. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. perl v5.10.1 2011-11-02 File::chdir(3pm)
All times are GMT -4. The time now is 01:34 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy