shell 英文含义是“壳”,这是相对于内核来说的,shell 也确实就像是内核的壳,通常来说,所有对内核的访问都要经由 shell 。同时,shell 还是一门功能强大的编程语言。shell 是 Linux 学习中必然要经过的一环。实际上,Linux 系统在启动完成,登录成功后运行的第一个程序就是一个 shell ,Linux 的许多功能都可以从 shell 中轻松实现。
一、什么是 shell
UNIX / Linux 系统在逻辑上可以分为两部分:内核和实用工具。shell 其实就是一个实用工具,准确的说,shell 是一个作为用户与 Linux 系统间接口的程序,它允许用户向操作系统输入需要执行的命令。
1.1 命令解释器 shell
shell 是一个命令解释器,可以将用户输入的命令翻译成内核可以识别的代码,然后由内核去控制硬件;而内核则可以通过 shell 将硬件信息翻译成用户可识别的代码,展现给用户。可以用下图大致表达一下 shell 与内核以及其他实用工具之间的关系:
Linux 提供了多种版本的 shell 供用户选择使用,它们大多数都是从最初的 Bourne shell(sh) 演变而来。在 Linux 中,最常用的 shell 是 bash(Bourne-Again Shell), /bin/bash 也是多数 Linux 系统的默认 shell。bash 是开源的,基于 GNU,且符合 POSIX 标准,因此可以被移植到几乎所有的类 UNIX 系统上,本文所使用的 shell 也是 bash。在大多数的 Linux 发行版中,默认的 shell 程序 /bin/sh 实际上是对程序 /bin/bash 的一个连接。
除此之外,还有许多其他的 shell 可以使用。 常用的 shell 有以下几种:
shell 名称 描述sh (Bourne shell) 源于UNIX早期版本的最初的 shell
csh、tcsh、zsh C shell 及其变体
ksh/pdksh korn shell 和它的公共域兄弟 pdksh(public domain korn shell),是许多商业版本 UNIX 的默认 shell
bash(Bourne-Again shell) l来自 GUN 项目,是 Linux 的主要 shell,它是开源的,且具有很高的移植型,与 kron shell 有许多相似之处
可以使用下面的命令来查看系统的默认 shell:
[linuxmi@localhost ~]$ echo $SHELL
/bin/bash
[linuxmi@localhost ~]$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-RedHat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[linuxmi@localhost ~]$
复制代码
如上,笔者的系统中的默认 shell 是 bash,使用 bash --version 命令查看 bash 的版本,可以看到 GNU 证书。
在 Linux 系统中安装多个 shell 是完全可行的,用户可以挑选一种自己喜欢的 shell 来使用,使用下面命令可以查看系统中有多少可以使用的 shell:
[linuxmi@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
复制代码
可以看到,系统中可用的 shell 有 sh 和 bash。同时,我们还发现有一个特殊的家伙混了进来:sbin/nologin。这其实也是一个 shell,使用这个 shell 的用户不允许登录当前系统,即使有密码也不行。不过,虽然无法登入系统,但是用户还是可以使用其他的系统资源的,许多系统账户都是使用的这个 shell,如 ftp、mail 等,它们只需要使用系统资源,而不需要登入系统,设置成使用 sbin/nologin 可以使系统更安全。
想要切换到另一个 shell 也很简单,直接运行这个 shell 就行,比如,笔者的系统上默认 shell 是 bash,如果我想要切换到 sh 的话,直接在命令行输入:/bin/sh 即可切换到 sh,再输入 exit 即可退出 sh 回到 bash:
[linuxmi@localhost ~]$ /bin/sh
sh-4.2$
sh-4.2$ exit
exit
[linuxmi@localhost ~]$
如果用户想使用 csh 或者 ksh 而系统中没有这个 shell 的话,也可以使用 yum 在线安装获得它们:
[linuxmi@localhost ~]$ sudo yum install csh
[linuxmi@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
复制代码
安装完成后再使用 cat /etc/shells 查看,可以发现 csh 已经可以使用了。
1.2 编程语言 shell