7

So I am trying to make a portable bashrc/bash_profile file. I have a single script that I am symbolically linking to .bashrc, .bash_profile, etc. I am then looking at $0 and switching what I do based on which script was called. The problem is what the shell calls the bashrc script of course it executes bash really which means $0 for me is -bash. $1 further more is not set to the script name.

So my question is, in bash how can I get the name of the script being executed. Not the binary executing it, e.g. bash?

I assume its giving me -bash with $1 not being set because it is really not a new process. Any ideas?

Gringo Suave
  • 29,931
  • 6
  • 88
  • 75
David Mokon Bond
  • 1,576
  • 2
  • 18
  • 42

3 Answers3

32

Try:

readlink -f ${BASH_SOURCE[0]}

or just:

${BASH_SOURCE[0]}.

Remarks:

$0 only works when user executes "./script.sh"

$BASH_ARGV only works when user executes ". script.sh" or "source script.sh"

${BASH_SOURCE[0]} works on both cases.

readlink -f is useful when symbolic link is used.

Hui Zheng
  • 10,084
  • 2
  • 35
  • 40
  • 2
    This should be the accepted answer since it gives more detail and explains the different scenarios clearer. – mez.pahlan Jul 20 '15 at 19:31
2

The variable BASH_ARGV should work, it appears the script is being sourced

$BASH_ARGV
Community
  • 1
  • 1
Zombo
  • 1
  • 62
  • 391
  • 407
  • Means this is not generic. When parsing $ARGV you'll have to know about that you have been called by an other script. Maybe I'm wrong. If I'm wrong you should enhance explanation of your answer, e.g. add an example – hek2mgl Feb 12 '13 at 15:02
0

create .sh file lets say view.sh then put

#!/bin/bash
echo "The script is being executed..."
readlink -f ${BASH_SOURCE[0]}
Amit Kumar
  • 619
  • 7
  • 10