I have two Bash scripts in the same folder (saved somewhere by the user who downloads the entire repository):
script.sh
is run by the userSince $0
holds the full path of the script that is running, you can use dirname against it to get the path of the script:
#!/bin/bash
script_name=$0
script_full_path=$(dirname "$0")
echo "script_name: $script_name"
echo "full path: $script_full_path"
so if you for example store it in /tmp/a.sh
then you will see an output like:
$ /tmp/a.sh
script_name: /tmp/a.sh
full path: /tmp
so
- Knowing the current working directory is useless to me, because I don't know how the user is executing the first script (could be with
/usr/bin/script.sh
, with./script.sh
, or it could be with../Downloads/repo/scr/script.sh
)
Using dirname "$0"
will allow you to keep track of the original path.
- The script
script.sh
will be changing to a different directory before callinghelper.sh
.
Again, since you have the path in $0
you can cd
back to it.
$0
is considered unsafe by many devs. I have found another solution, it is safe for a chain of bash scripts and source
.
If a.sh
needs to execute b.sh
(located in the same folder) using a child bash process:
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
bash ${__dir}/b.sh
If a.sh
needs to execute b.sh
(located in the same folder) using the same bash process:
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source ${__dir}/b.sh