3

I have a batch file (.command) that I double click to do work. It has dependencies on files in the same folder, but if I double click the .command file it just launches and assumes the current location is /~

How do I find/specify the location of the .command file in the script itself, so I can refer to relative assets?

4

If you're using bash (i.e. the script starts with #!/bin/bash), you can use $BASH_SOURCE to get the filename of the script. From that, you can get the directory it's in:

mydir="$(dirname "$BASH_SOURCE")"

...and then use that to find files relative to the script, e.g. cp "$mydir/fileInTheSameFolder" /tmp (and please always use double-quotes around it, as I did here).

Note that this may be a relative path; for example, if the script was run from an interactive shell with ./scriptname.command, it'll just come out as ".". This shouldn't be a problem unless the script cd's somewhere else, but if you need the full path you can use this instead:

mydir="$(cd "$(dirname "$BASH_SOURCE")" && pwd)" || {
    echo "Error getting script directory" >&2
    exit 1
}

Or, could just cd to the script's directory at the beginning of the script:

cd "$(dirname "$BASH_SOURCE")" || {
    echo "Error getting script directory" >&2
    exit 1
}
5
  • The path can't be found when directory names contain spaces. – Steven Vachon Sep 5 '16 at 22:46
  • @StevenVachon It should work as long as you put double-quotes around all references to the path. That is, ls "$mydir" and somecommand >>"$mydir/output.log" will work, but ls $mydir and somecommand >>$mydir/output.log will fail. This is one of the reasons it's a good idea to double-quote (almost) all variable references in shell scripts. – Gordon Davisson Sep 5 '16 at 23:02
  • the $BASH_SOURCE is empty in MacOS, but having a value in Linux – LCB Jun 12 '18 at 7:41
  • @LCB Are you sure you're running the script under bash, not some other shell? – Gordon Davisson Jun 12 '18 at 23:33
  • @GordonDavisson I got the reason because I am using oh-my-zsh. and I didn't know that the line #!/bin/bash will be ignored if I run the file with source ./script.sh. – LCB Jun 13 '18 at 10:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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