学好linux,首先要深入理解shell。
shell俗称壳,它包裹在内核的外面,是用户命令的翻译官。
作用:接收用户的命令,翻译后(处理一下)交给Linux内核处理。
用户执行命令 -> shell -> 内核 -> CPU -> 内核 -> shell ->用户获取结果
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
目前,CentOS默认的shell为bash。
不同的shell的命令会有所差别,这就是Ubuntu和CentOS等不同操作系统命令不一样的原因。
本文从shell的分类、查看信息和切换入手,讨论shell的相关知识。
a.字符画shell
字符画shell就是CLl,也就是我们常说的命令行
b.图形化shell
图形化shell就是GUI,也就是我们常说的桌面
shell的图形化工具(dialog)
执行命令nmtui
目前较为流行或者历史上存在的一些shell的种类很多。目前流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。
a.bash
是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
b.sh
BourneShell(sh):是由AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。
c.ksh
ksh有42条内部命令,与bash相比有一定的限制性。但是ksh主要用于unix例如HP-Uinx
d.dash
dash是为跑脚本而生的,具有比bash更快的效率,但是交互性能较差。现在主要用在Debian和Ubuntu上。其内部命令以及参数等与bash有一些差别,如果使用bash命令写的一些脚本可能会出错。
e.tcsh & csh
把tcsh和csh放一起介绍是因为目前这两种sh其实是同一种,tcsh是csh的增强版,并且完全兼容csh。顾名思义csh,其实是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多。
f.pdksh
pdksh是Oracle自身的一种shell,主要用在Oracle数据库管理上。一般是DBA才会使用这种shell。它与ksh不能共存,如果系统中安装了ksh,那么安装pdksh时会报错。
g.zsh
目前Linux里最庞大的一种shell:zsh。它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该shell。
在查看/etc/passwd文件时,有一类系统用户使用/bin/nologin,这是指用户不能登录或不用登录,仅作为后台服务。
按登录方式,可以把shell分为登录shell和非登录shell两种。
a.登录shell
需要用户名、密码登录后才能进入的shell(或者通过"–login"选项生成的shell)。
b.非登录shell
不需要输入用户名和密码即可打开的Shell。
例如:直接命令"bash" 就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序就是一个非登录shell。
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)。
按是否进行交互,分为交互式shell和非交互式shell两种。
a.交互式模式
就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互而达成目的。
这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
b.非交互式模式
以shell script(非交互)方式执行脚本文件。
在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
按传承关系或shell的上下级关系,可分为父shell和子shell两种。
a.父shell
在当前shell中,再打开一级shell时,当前shell称为父shell。而新打开的shell称为子shell
父子shell环境变量一致,但普通变量有独立作用域:父shell变量可以在子shell中使用,而子shell变量不能在父shell中使用。
b.子shell
子shell可以继续创建子shell。
生成子shell的成本不低,而且速度还慢,创建嵌套的子shell去处理命令进程性能更为严重。
通过输入exit命令能有条不絮的退出子shell。
当没有了子shell时,再输入exit将退出控制台终端。
通过命令行可以查看系统支持的shell,也可以查看当前用户正在使用的shell。
查询系统支持的shell有两种方法。
a.cat /etc/shells
b.chsh –l
执行该命令,亦可以查看系统支持的shell。
查询当前用户正在使用的shell,有多种方法,可以灵活选择。
a.echo $SHELL
执行命令显示出当前用户正使用的shell。
b.echo $0
c.env | grep SHELL
d.ps
本系统设置运行级别为3
通过执行init 5
切换到图形化shell
可以通过按Ctrl+alt+F1-- Ctrl+alt+F2相互切换
也可以在命令行执行:
init 3/5 进行切换
a.添加用户时指定
b.修改用户sh
c.编辑/etc/passwd
d.chsh
执行下列命令,可以改变当前用户使用的shell。
chsh -s /usr/bin/czh [用户名]
要更改的新的shell要写绝对路径。
修改了系统默认shell(或用户使用的shell)之后不会立即生效,之后再次登录系统修改的shell才会生效。
对于chsh命令,可以通过man chsh查看了解。
选择使用不同的Shell,可以有各种原因。Shell一般由管理员在创建用户时,为用户指定;其保存在/etc/passwd文件中;或通过usermod命令进行更改。也可在登录后执行相应的命令切换Shell。
要使用不同的shell,就需要安装相应的shell软件。最方便的仍是用yum命令。
yum -y install zsh
yum -y install ksh
yum -y install dash
Shell其实是一个有特殊功能的程序,主要是提供用户与内核交互操作的一个接口。它的位置介于用户界面和内核之间,工作流程是接收用户输入的命令并且进行解释(转换为计算机可以理解的机械码),然后将命令送入内核去执行。我们一般通过ssh远程登录系统并且打开shell,也有一些是直接在图形界面上直接打开终端的方式打开shell。
Shell脚本的优势在于处理偏操作系统底层的业务,例如,Linux内部的很多应用都是使用Shell脚本开发的,因为有1000多个Linux系统命令为它作支撑,特别是Linux正则表达式以及三剑客grep、awk、sed等命令。
对于一些常见的系统脚本,使用Shell更符合Linux运维简单、易用、高效的三大原则。