You need to use the combination of the following:
[a] readlink - Display value of a symbolic link or canonical file name.
This is a safe way to get the target of a symbolic link.[b] ${BASH_SOURCE[0]} or $0 - The name of the shell script file is stored in $0 or ${BASH_SOURCE[0]}
Please note that the following examples are only tested on the Bash shell running on Debian Linux. This code may not be portable and may break on other Linux distributions/Unix like operating systems.
Examples
Create a shell script as follows:
#!/bin/bash # Name: /tmp/demo.bash : # Purpose: Tell in what directory $0 is stored in # Warning: Not tested for portability # ------------------------------------------------ ## who am i? ## _script="$(readlink -f ${BASH_SOURCE[0]})" ## Delete last component from $_script ## _base="$(dirname $_script)" ## Okay, print it ## echo "Script name : $_script" echo "Current working dir : $PWD" echo "Script location path (dir) : $_base"
Save and close the file. Run it as follows:
$ chmod +x /tmp/demo.bash
$ /tmp/demo.bash
Sample outputs:
Script name : /tmp/demo.bash Current working dir : /home/vivek Script location path (dir) : /tmp
cd to /home/vivek
$ cd ~
$ /tmp/demo.bash
Sample outputs:
Script name : /tmp/demo.bash Current working dir : /home/vivek Script location path (dir) : /tmp
Run it as follows:
$ ../../tmp/demo.bash
Sample outputs:
Script name : /tmp/demo.bash Current working dir : /home/vivek Script location path (dir) : /tmp
Finally, create a symbolic link in /home/vivek and test it:
$ cd ~
$ ln -s /tmp/demo.bash
$ ./demo.bash
$ rm demo.bash
Sample outputs:
Script name : /tmp/demo.bash Current working dir : /home/vivek Script location path (dir) : /tmp
Know a better way to solve this problem? Add in the comments below.
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop









![Bash Shell Scripting Disable Control-C [ CTRL+C ] Keys](http://s13.cyberciti.org/images/shared/rp/3/30.jpg)



{ 7 comments… read them below or add one }
# Dir in which bash script is
echo `pwd`
# name of bash script file
echo `$0
echo `pwd` is not the directory in which the script is located in, but the current working directory, and echo $0 will not the print the name of the script, but the name of the command that is called. For example if the script is located in /home/username/my_script.sh and it contains:
then if you run the following commands:
the script will print:
and we want to print the dir of the script (/home/username), and the name of the script (my_script.sh).
I would just like to confirm that readlink -f works for me on both Centos 5 and 6.
I tend to use
Nice one liner. But, it will fail with softlink (see the last example ln -s).
A couple of recommended optimizations (Linux only)
* use ‘readlink -m’ instead of ‘readlink -f’
* avoid using ‘dirname’, use bash’s internal ‘string cut’ functionality
Cheers,
Shantanu
Why is ‘readlink -m’ better than -f?
What do you mean buy bash’s internal ‘string cut’? Do you mean this:
echo ${0##*/}Here’s one excerpted from a functions file, and modified to standalone.
It works in ksh and bash, don’t know about other shells.
ts20 > cat functions.sh/fqn.sh
function getScriptPath {
typeset SCRIPT=$1
STAT_RESULT=$(stat –format=%N $SCRIPT | sed -e “s/[\`']//g”)
if [ -L "$SCRIPT" ]; then
STAT_RESULT=$(echo $STAT_RESULT | awk ‘{ print $3 }’)
fi
echo $STAT_RESULT
echo $(getScriptPath $0)
ts20 > functions.sh/fqn.sh
functions.sh/fqn.sh
ts20 > ln -s /home/jkstill/shell/functions.sh/fqn.sh /tmp
ts20 > /tmp/fqn.sh
/home/jkstill/shell/functions.sh/fqn.sh