I'd like to retrieve the absolute file name of the script file that's currently executed. Links should be resolved, too.

On Linux, this seems to be done like this:

$(readlink -mn "$0")

but readlink seems to work very differently on Mac OS X.

I've read that this is done using

$(realpath $0)

in BSD but that doesn't work, either. Mac OS X does not have realpath.

Any idea?

link|improve this question
1  
See this question over on SO: stackoverflow.com/questions/799679/… – Telemachus Jul 13 '09 at 21:21
2  
And this one: stackoverflow.com/questions/1055671/… – Telemachus Jul 13 '09 at 21:23
Thanks for the hints! – Huxi Jul 13 '09 at 23:03
feedback

1 Answer

up vote 6 down vote accepted

I cheat and use perl for this very thing:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

You'd think I'd just write the entire script in perl, and often I do, but not always.

link|improve this answer
This works, thanks a lot. I'll give you an upvote as soon as I can. Does anyone have a "pure shell" way of doing this? – Huxi Jul 13 '09 at 21:17
I'm afraid this is as good as it gets. (Given the many multiple-line "pure shell" hacks one can find on Google.) – Arjan Jul 13 '09 at 21:34
another possibility (though ugly) is to traverse the '..' path, memorizing (thru recursion or an array) until '..' returns the same file you just had (ie: you are at the top), then come back assembling the path as you go. I've seen Legato's Networker backup software doing this during strace as a method of obtaining a 'true' path (but perhaps not absolute). But it would be a lot more code than the above. – ericslaw Jul 14 '09 at 2:56
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.