Asked by Chetan Joshi
Q. What is the best way to find out what shell I'm using. echo $SHELL is not so reliable. Please let me know any tiny command or trick.
A. Chetan, echo $SHELL should work. But here is old good UNIX trick. Use the command ps with -p {pid} option, which selects the processes whose process ID numbers appear in pid. Use following command to find out what shell you are in:
ps -p $$
So what is $ argument passed to -p option? Remember $ returns the PID (process identification number) of the current process, and the current process is your shell. So running a ps on that number displays a process status listing of your shell. In that listing you will find the name of your shell (look for CMD column) .
$ ps -p $$
Output:
PID TTY TIME CMD 6453 pts/0 00:00:00 csh
From my Linux box:
$ ps -p $$
Output:
PID TTY TIME CMD 5866 pts/0 00:00:00 bash
You can store your shell name in a variable as follows :
MYSHELL=`ps -hp $$|awk '{echo $5}'`
Please note those are backquotes, not apostrophes
Or better try out following if you have a bash shell:
MYSHELL=$(ps -hp $$|awk '{echo $5}')
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













{ 25 comments… read them below or add one }
thanks this is what i looking for
you can also use
echo $0
This is the only method listed here that works for me (Mac OS X).
-hp might not work. Also, echo?
ps h -p $$ | awk ‘{print $5}’
You can also find this out from et/passwd file :
Command to run:
# cat /etc/passwd
Sure, does this give accurate result?
No, it tells you the *default* shell for every user, not the one you are actually using in your current session.
Use
or as others said:
ps h p $$ | awk '{ print $NF }' /bin/bashIf you only need the shell name and not its executable full path:
basename $( ps h p $$ | awk '{ print $NF }' ) bashexactly what i was looking for. thanks
Thanks ..
you can also use
ps | grep $$
Thanks for this.
But the last sentence…
“Or better try out following if you have a bash shell:
MYSHELL=$(ps -hp $$|awk ‘{echo $5}’)
”
If you have a bash shell, couldn’t you just do
MYSHELL=”bash”
?
LOL, just what I was thinking. ^^
ps -p $$
and
echo $0
thanks a lot!
I noticed that, command such as; ps -$$, echo $SHELL, echo $0, printenv will print the current shell, but In case you have temperoraly changed your shell, these commands will not show the changes, unless you log out and log In. Whereas, cat /etc/passwd file will show the change mmediately without loging out.
For ex: At the current shell (ex-/bin/bash), if you type ‘chsh’ and then enter /bin/tcsh, it will change the shell to ‘tcsh’, but the cmds mentioned above will still be reporting the old shell that is /bin/bash, unless you logout. But, /et/passwd file will show the changes immediately.
Hi John,
and
always return the current shell, even from a sub-shell because they print the current process.
The /etc/passwd file is simply a file and then it does not store the current user shell but the login shell. In your example, you are using the Change login shell (chsh) to actually change the shell automatically launched at your login, and this is why the change is immediately visible in the /etc/passwd file.
I verified the output and it seems what you have said is totally opposite.. i.e, when u change the shell the changes are updated in ps -$$, echo $shell, echo $0 , and printenv. But not /etc/passwd file
you can also use
ps -u
$ bash
in
[a148503@wuvra99a0219 logs]$ uname -a
Linux wuvra99a0219 2.6.18-194.8.1.el5 #1 SMP Wed Jun 23 10:52:51 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
$SHELL is the only thing remaining as ksh:
[a148503@wuvra99a0219 logs]$ ps -$$
PID TTY STAT TIME COMMAND
18336 pts/13 S 0:00 bash
[a148503@wuvra99a0219 logs]$ echo $SHELL
/usr/bin/ksh
[a148503@wuvra99a0219 logs]$ echo $0
bash
pwd.
This is not 100% accurate.
Example (note how my shell is given the name “csh”, but it is really a tcsh):
[me@localhost ~]$ echo $SHELL /bin/csh [me@localhost ~]$ sh --version GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. [me@localhost ~]$ $SHELL --version tcsh 6.14.00 (Astron) 2005-03-25 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filecSo how to get the exact 100% accurate result?
How to know the current shell I’m using?
Nice tricks.
Hi, I have a problem which cannot be solved with the methods mentioned above. I need to find out within a bash script from which shell it was executed. If I use the methods above, I of course get always bash, since the executed script is a bash script. Does anybody have an idea?
Cheers, Jim
Just a note: why use awk if
ps -p $$ -o ucomm=
does the trick and supported by most *nixes?
Just a note: why use awk, if
ps -p $$ -o ucomm=
does the trick?