人机交互程序的交互方式可以是命令行模式,也可以是图形界面。在命令行模式中,负责与用户交互的人机交互程序称为shell(shell这个词中文是“外壳”的意思,它自身的含义就说明了其与Linux内核之间的关系)。shell是一个非常特殊的程序,包含在内核之外,主要作用是将用户输入的命令解释成内核能够识别的指令,然后传递给内核,内核控制硬件执行相关的指令并将结果通过硬件输出。从这个过程可以看出shell主要作用是负责人与内核之间的交互。
默认情况下,Linux系统中会安装多个shell,系统中的每个用户都可以使用这些shell。当用户被创建时,系统会为用户指定一个默认的shell,如果没有指定使用何种shell,大多数Linux会指定Bash Shell作为用户的默认shell。
shell分类
注意:几乎所有的UNIX和Linux都安装了Bsh,不仅如此,在某些特殊情况下(例如救援模式下),Bourne Shell可能是唯一可用的Shell。
除了Csh外,大多数发行版中还安装有另一个Tcsh,这是一个增强版的Csh,在Csh的基础上扩展了许多新的功能。
更改默认shell:
1、查看系统中安装的shell及版本
系统将安装的shell程序列表放在/etc/shells文件中,可以通过查看该文件获取shell列表:
#cat /etc/shells
/bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh /bin/ksh
注意:/sbin/nologin并不是一个可用的shell,当用户使用它作为默认的shell时,系统将会阻止用户登录系统。
有些使用者可能喜欢某些版本的shell,这时就需要查看相关shell的版本信息。几乎所有的shell都支持version选项,可以使用这个选项查看shell的版本信息。
2、更改用户默认shell
要更改用户shell,一般有两个办法:临时修改当前使用的shell、修改用户默认shell。
(1)临时修改当前使用的shell
要临时更改当前使用的shell,可以直接输入需要使用的shell命令,例如临时使用Ksh:
[root@localhost etc]# ksh
# echo $SHELL
/bin/bash
在上面这个临时更改的shell例子中,命令echo $SHELL输出的结果显示当前用户使用的仍然是Bash。原因是当前正在使用的ksh是运行在bash下的一个程序,即bash将ksh看做一个程序来运行(此时一般称ksh是bash的子shell)。要避免ksh称为bash的子shell,只有通过修改用户默认shell的方法实现。
提示:如果要退出临时的ksh,可以使用exit命令,大多数shell都支持该命令。不支持这个命令的shell可以使用快捷键Ctrl+C,强制结束被认为是应用程序的子shell。
(2)修改默认shell
如果用户想要自己修改默认shell,可以使用chsh命令。例如要修改用户的默认shell为ksh:
[zhu@localhost etc]$ grep zhu /etc/passwd zhu:x:500:500:zhu:/home/zhu:/bin/bash [zhu@localhost etc]$ chsh Changing shell for zhu. Password: New shell [/bin/bash]: /bin/ksh Shell changed. [zhu@localhost etc]$ grep zhu /etc/passwd zhu:x:500:500:zhu:/home/zhu:/bin/ksh
chsh命令要求输入当前的密码和更改后的shell,正确输入后就可以完成修改了。从命令的执行结果可以看出,chsh通过修改文件/etc/passwd的shell字段的方式修改默认的shell。
系统文件/etc/passwd用于保存系统中所有的用户及其设置。
然后chsh命令并不能被所有系统支持,这时就需要求助于系统管理员。系统管理员修改时可以使用usrmod命令:
[root@localhost etc]# grep zhu /etc/passwd zhu:x:500:500:zhu:/home/zhu:/bin/ksh [root@localhost etc]# usermod -s /bin/bash zhu [root@localhost etc]# grep zhu /etc/passwd zhu:x:500:500:zhu:/home/zhu:/bin/bash
修改完成后,用户只要重新登录系统就可以使用修改后的默认shell了。
如果要在用户创建时指定其默认的shell,可以使用:
[root@localhost etc]# useradd -s /bin/ksh user1 [root@localhost etc]# grep user1 /etc/passwd user1:x:501:501::/home/user1:/bin/ksh