Remember also that the "caller" function can say what the location of
the file (package) is, in relation to the host filesystem. Read
about it, it may be of use ;)
David
On 9 Mar, 2009, at 23:24, Chris Devers wrote:
This isn't necessarily a Mac-specific question, but I've gotten rusty
and I'm having a brain fart here.
How can a Perl script reliably, portably resolve the path inside which
it is running? Not the PWD of the caller, mind you, but the actual
current full path of the script itself?
Context: I have a pair of utility apps meant to be run in tandem. The
first is a Pashua questionnaire that shows some forms and saves
results
to a file. The second is a Platypus script that gets admin access
(hence
needing another app -- I couldn't see how to get Pashua to prompt for
admin access), then uses the results from the first app to do some
`defaults write ...` & `sudo networksetup ...` type system calls.
Because the apps are meant to be distributed & run together, I've
placed
the second one inside the Contents/Resources/ folder of the first one,
which finishes with (simplifying slightly):
my $helper = "$ENV{'PWD'}/../Resources/Helper.app";
system("/usr/bin/open "$helper'") and die "Couldn't run $helper:
$!";
If I first put the first app in /Applications, this works fine.
The problem is I can't rely on $ENV{'PWD'} having something useful.
If I
move the parent app from /Applications (to the Desktop, a USB drive, a
disk image, or a Samba volume), or if I invoke the Pashua script
from a
shell, then the $helper variable typically ends up with something
useless (often but not always just "/../Resources/Helper.app") and the
second app never executes.
I've thought of a few ways around this (e.g. wrap the whole thing
in an
installer package so I can force & depend on a single path), but they
all seem cumbersome to varying degrees. Ideally, it should behave
like,
say, Firefox, where it will run the same way no matter where the user
wanted to put (or not bother to put) the app bundle.
Is there a common way to do this? What $ENV variables can be relied on
to have the full path to the running Perl script from which a working
relative path can be derived? Is there some other way that this is
already a Solved Problem, or should I just muddle through?
Any help very much appreciated :-)
Pashua:
http://www.bluem.net/en/mac/pashua/
http://macresearch.org/
command_line_tutorial_part_iii_windows_of_opportunity
Platypus:
http://www.sveinbjorn.org/platypus
http://www.macresearch.org/
command_line_tutorial_part_i_native_mac_apps_for_command_line_tools
http://www.macresearch.org/
command_line_tutorial_part_ii_making_progress_and_finding_options
--
Chris Devers
David Green
mrdgr...@mac.com
"Where you stand determines what you see." -- SAMUEL A. CULBERT