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?

1 Answer 1

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. Sep 5, 2016 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. Sep 5, 2016 at 23:02
  • the $BASH_SOURCE is empty in MacOS, but having a value in Linux
    – LCB
    Jun 12, 2018 at 7:41
  • @LCB Are you sure you're running the script under bash, not some other shell? Jun 12, 2018 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, 2018 at 10:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .