Search code examples
bashshellargv

script full name and path $0 not visible when called


I have a script "task.sh" with the following content:

#!/bin/bash

CUR_DIR=`pwd`
SCRIPTPATH="${CUR_DIR}/`dirname $0`"

when I call it with "bash task.sh" it works as expected but when it is called with ". task.sh"

$ . log/task.sh 
dirname: invalid option -- b
Try `dirname --help' for more information.

When the script is being scheduled in crontab it is not working as well. Can someone tell me what am I doing wrong or a different way in order to get the directory of a script that is not the current directory ?


Solution

  • When you invoke it as bash task.sh, bash assigns "task.sh" to $0 (from the bash manual: "If Bash is invoked with a file of commands [...] $0 is set to the name of that file.").

    When you source the file, bash does not alter $0, it just executes the script in the current environment. What's in $0 in your current enviroment?

    $ echo "$0"
    -bash
    

    The leading dash will be interpreted by dirname as an option.

    If it's in a cron job, why are you sourcing it?

    If you need to source your script, this will work if your shell is bash:

    SCRIPTPATH="${CUR_DIR}/${BASH_ARGV[0]}"
    

    However, cron's shell is, I believe, /bin/sh. Even if /bin/sh is a symlink to bash, when bash is invoked as sh it will try to behave POSIXly: the BASH_ARGV array probably won't be available to you.