shell基础

人机交互程序的交互方式可以是命令行模式,也可以是图形界面。在命令行模式中,负责与用户交互的人机交互程序称为shell(shell这个词中文是“外壳”的意思,它自身的含义就说明了其与Linux内核之间的关系)。shell是一个非常特殊的程序,包含在内核之外,主要作用是将用户输入的命令解释成内核能够识别的指令,然后传递给内核,内核控制硬件执行相关的指令并将结果通过硬件输出。从这个过程可以看出shell主要作用是负责人与内核之间的交互。

默认情况下,Linux系统中会安装多个shell,系统中的每个用户都可以使用这些shell。当用户被创建时,系统会为用户指定一个默认的shell,如果没有指定使用何种shell,大多数Linux会指定Bash Shell作为用户的默认shell。

shell分类

  • Bourne Shell:简称Bsh,Bsh是最早的UNIX Shell,1979年Bourne Shell诞生于贝尔实验室,编写它的作者是Stephen Bourne,它由此而得名。它不仅可以解释命令,还可以用来编写脚本,尽管在功能上有一些缺憾(例如缺少进程控制等),到目前为止仍有很多人在使用它。

注意:几乎所有的UNIX和Linux都安装了Bsh,不仅如此,在某些特殊情况下(例如救援模式下),Bourne Shell可能是唯一可用的Shell。

  • C Shell:简称Csh,诞生于20世纪80年代,由加州大学的Berkeley分校开发。在Shell提示符下进行操作时并不会发现C Shell与其他Shell的区别,然而在使用Csh编写脚本时,可以发现Csh与C语言的语法结构很相似(因此而得名)。

除了Csh外,大多数发行版中还安装有另一个Tcsh,这是一个增强版的Csh,在Csh的基础上扩展了许多新的功能。

  • Korn Shell:简称Ksh,编写它的作者是David Korn,并以Korn命名。Ksh与Bourne Shell一样,也来自贝尔实验室。Ksh对Bourne Shell进行扩展的同时,还集成了许多来自C Shell的特性,新增了数学运算、行内编辑等功能,正因如此,Ksh很受欢迎。
  • Bourne Again Shell:简称Bash,它是GNU的一个项目,其最初的目的是为基于GNU的操作系统编写的标准Shell。Bash是目前最流行的Shell(几乎所有的Linux发行版都使用Bash作为默认的Shell),它能够很好地兼容Bsh,几乎所有用Bsh编写的脚本都能在Bash中运行。
  • Z Shell:简称Zsh,出现在20世纪90年代初期。与其他shell相比,Z Shell拥有强大的功能,融合了众多shell的优点。虽然如此,Zsh 的使用者却很少,其原因在于强大的功能背后,是众多的选项和复杂的配置。

更改默认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

你可能感兴趣的:(shell)