When writing a bash script, how do I get the absolute path of the location of the current file?
Suppose I have a bash file called myBash.bash. It resides in:
/myDirect/myFolder/myBash.bashNow I want to use the string /myDirect/myFolder (the location of myBash.bash) inside the script. Is there a command I can use to find this location?
Edit: The idea is that I want to set-up a zip-folder with code that can be started by a bash script inside that zip-file. I know the relative file-paths of the code inside that zip-file, but not the absolute paths, and I need those. One way would be to hard-code in the path, or require the path of the file to be given as a variable. However I would find it easier if it was possible for the bash-file to figure out where it is on its own and then create the relevant paths to the other file from its knowledge of the structure of the zip-file.
94 Answers
You can get the full path like:
realpath "$0"And as pointed out by Serg you can use dirname to strip the filename like this
dirname "$(realpath $0)"or even better to prevent awkward quoting and word-splitting with difficult filenames:
temp=$( realpath "$0" ) && dirname "$temp"Much better than my earlier idea which was to parse it (I knew there would be a better way!)
realpath "$0" | sed 's|\(.*\)/.*|\1|'Notes
realpathreturns the actual path of a file$0is this file (the script)s|old|new|replaceoldwithnew\(.*\)/save any characters before/for later\1the saved part
The accepted answer seems perfect. Here's another way to do it:
cd "$(dirname "$0")"
/bin/pwd/bin/pwd prints the real path of the directory, as opposed to the pwd builtin command.
if the script is in your path you can use something like
$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.shEDIT: after reading comments from Serg, this might be a generic solution which works whether the script is in your path or not.
myloc==$(dirname "$(realpath $0)")
dirname "$myloc" 1 wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in /*) scriptdir="${0}";; *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"It is taken as reference from kenorb and andro
No dirname, readlink, realpath, BASH_SOURCE
All are builtins