linux shell版本分类


1.shell的不同版本简介

回到顶部
由于早年的Unix年代,发展者众,所以由于shell依据发展者的不同就有许多的版本,例如常听到的Bourne SHell(sh)、 在Sun里头默认的C SHell、商业上常用的K SHell、, 还有TCSH 等等,每一种Shell都各有其特点。 目录大多数linux发行版默认的shell就是bash,bash为Bourne Again Shell的简写,意为Bourne Shell的增强版本, 也是基准于 GNU 的架构下发展出来的!
第一个流行的shell是由Steven Bourne发展出来的,为了纪念他所以就称为Bourne shell,简称为sh!
另一个广为流程的shell为c shell,c shell是由柏克莱大学的Bill Joy为BSD版的Unix系统设计的shell, c shell的语法有点类似C语言,所以才得名为C shell ,简称为csh !由于在学术界Sun主机势力相当的庞大, 而Sun主要是BSD的分支之一,所以C shell也是另一个很重要而且流传很广的shell之一 。 由于Linux为C程序语言撰写的,很多程序设计师使用C来开发软件,因此C shell相对的就很热门了。 Sun 公司的创始人就是 Bill Joy,而BSD最早就是 Bill Joy 发展出来的啊。
由于linux操作系统有各种不同的发行版,每种发行版都可能有不同的shell。 实际上shell只是linux命令解释器的一个统称,就像一个人可以穿不同的衣服一样,shell作为linux操作系统的外壳,也可以有很多种不同版本的shell。 常用的shell有Korn Shell、Bourne shell、C shell、Bourne Again shell。 目前大部分linux发行版默认的shell就是Bourne Again shell,简称bash。

2.查看系统的合法shell

回到顶部
/etc/shells文件记录了当前系统登录用户可以使用的shell:

[root@initroot ~]$ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
              
系统某些服务在运行过程中可能会通过/etc/shells文件检查登录用户能够使用的shells!
举例来说,某些FTP网站会去检查使用者的可用shell,而如果你不想要让这些用户使用FTP以外的主机资源时, 就会给予该登录用户一些特别的shell,让使用者无法以其他服务登入主机。这个时候,你就得将那些特殊的shell写到/etc/shells当中了。 举例来说,我们的CentOS 7.x 的/etc/shells里头就有个/sbin/nologin文件的存在,这个就是我们说的怪怪的shell啰~
/etc/passwd文件中每一行的最后一个字段记录了登录用户默认取得的shell, 当登录用户登录系统后,就会查询该文件来获取登录用户的shell,passwd文件内容如下所示:
[peter@study ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
...省略...
如上所示,每一行的最后一个字段就是登录用户默认的登录shell了。例如root用户的登录shell是/bin/bash, 注意有些账号例如系统账号bin与daemon等,他们的登录shell有点奇怪,是/usr/sbin/nologin。表示该用户登录后是无法取得shell。
/etc/shells文件列出了当前系统可用的所有登录shell,通过cat命令查看该文件的内容如下:
            peter@initroot:/home/wwwroot/default/kblog$ cat -n /etc/shells
            1 # /etc/shells: valid login shells
            2 /bin/sh
            3 /bin/bash
            4 /bin/rbash
            5 /bin/dash
            
加上-n选项可以输出每行的行号. 更多关于cat命令的内容可参考:cat和tac

3.查看当前系统运行的shell

回到顶部
那么如何查看当前系统用的是哪个版本的shell呢?只需要通过查看SHELL环境变量就可以看到当前登录用户用的是哪个shell了。
echo命令可以显示变量的值,在shell命令行输入如下命令:
            peter@peter-VirtualBox:~$ echo $SHELL
            /bin/bash
            
输出的是一个文件的绝对路径名,文件名为/bin/bash。怎么shell是一个文件吗? 我们知道linux命令是计算机软件程序,绝大多数软件程序都是以可执行文件的形式存放在磁盘的某个目录中, 而这些可执行文件大部分都是由c/c++语言或者汇编语言编写的程序代码通过编译链接而来。 shell自然也不例外,也是由c语言编写的计算机程序,所以这里的/bin/bash其实就是bash的可执行程序文件了。 可以看到当前系统运行的shell就是bash shell,如果不加特别说明,我们提到的shell,默认就是指bash shell。

更多关于echo命令的内容可参考:echo命令
更多关于shell变量和环境变量的内容可参考: linux shell变量与环境变量
更多关于计算机程序和c/c++语言编程以及编译链接的知识可以参考:
c/c++程序的基本概念
c/c++程序设计
linux高级编程

也可以通过查看/etc/passwd文件每一行的最后字段查看每个用户登录后运行的是哪个shell:

peter@initroot:~$ cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
...
41 peter:x:1000:1000:peter,,,:/home/peter:/bin/bash
43 test:x:1001:1001::/home/test:/bin/sh
              
关于/etc/passwd文件的详细说明参考: linux用户管理

关于shell的更多内容参考:
什么是linux shell
认识bash shell

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读