Linux初探
Shell命令初窥
1.1 关于Linux
1.1.1 什么是Linux
Linux是自由开源的类Unix操作系统。该操作系统的内核是由莱纳斯·托瓦兹在1991年10月5日首次发布。
严格来讲,术语Linux只表示操作系统的内核本身,但通常采用“Linux内核”来表达该意思。Linux则常用来指基于Linux内核的完整操作系统,包括GUI组件和许多其它实用工具。
Linux最初是作为支持Intel x86架构的个人计算机的一个自由操作系统开发的,目前Linux已经被移植到更多的计算机硬件平台。世界上500个最快的超级计算机90%以上运行Linux发行版或变种,包括最快的前10名超级计算机运行的都是基于Linux内核的操作系统。Linux也广泛应用在嵌入式系统上,如手机、平板电脑、路由器、电视和电子游戏机等。在移动设备上广泛使用的Android操作系统就是基于Linux内核的。
1.1.2 谁创建了Linux
1991年,莱纳斯·托瓦兹开始了那个之后变为Linux 内核的项目。它最初是托瓦兹用于访问大学里的UNIX服务器的一个终端模拟器。他专门为他当时正在使用的硬件写了一个独立于操作系统的程序,因为他想使用他的80386处理器的新计算机的功能。这个程序的开发是在使用GNU C编译器的MINIX操作系统上完成的,即Linux的前身。
如托瓦兹在他的书中《Just for Fun》所写,他最终意识到他编写了一个操作系统内核。1991年8月25日他在Usenet上发布了这个系统。
1.1.3 Linux在日常生活中的使用
作为一个杰出的操作系统可以应用于:
- 台式计算机
- 网站服务器
- 软件开发工作站
- 网络监控工作站
- 工作组服务器
- 杀手级网络服务,例如DHCP、防火墙、路由、FTP、SSH、邮件、代理、代理缓存服务器等等。
1.1.4 Linux Kernel是什么
如前面所说,Linux内核,即Linux操作系统的核心。它主要由以下模块组成:
- 进程管理
- 定时器
- 中断管理
- 内存管理
- 模块管理
- 虚拟文件系统接口
- 文件系统
- 设备驱动程序
- 进程间通信
- 网络管理
- 系统引导
1.1.5 Linux的理念
如之前所述,Linux是类Unix的操作系统,Unix的理念是一套基于Unix操作系统顶级开发者们的经验提出的软件开发的准则和哲学。因此这些理念也同样适用于Linux操作系统。
- 小即是美
- 让程序只做好一件事
- 可移植性比效率更重要
- 一切即文件 – 适用方便而且把硬件作为文件处理是安全的
- 使用Shell脚本来提高效率和可移植性
- 避免使用可定制性低下的用户界面
- 所有程序都是数据的过滤器
1.2 什么是Linux Shell
Linux Shell是用户和Linux内核之间的接口程序,为用户提供使用操作系统的接口。当从Shell向Linux传递命令时,内核会做出相应的反应。
- Shell是一个用户程序,或是一个为用户与系统交互提供的环境
- 它是一个执行从标准输入设备(比如键盘或文件)读入的命令的语言解释程序,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序所调用。
- 当你登录或打开控制台时Shell就会运行
- Shell不是系统内核的一部分,但是它使用系统内核执行程序,创建文件等
- 我们可以通过多种方式来访问和使用Shell:
- 终端 – Linux桌面提供基于GUI的登录系统。一旦登录你就可以通过运行X终端(XTerm)、Gnome终端(GTerm)或KDE终端(KTerm)应用程序来访问Shell。
- 安全Shell连接(SSH)- 可以通过它远程登录服务器或工作站来访问其Shell。
- 使用控制台 – 一些Linux系统同样提供基于文本的登录系统。通常情况下,登录系统后就可以直接访问Shell。
Linux Shell的另一个重要特性是它自身就是一个解释型的程序设计语言,Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构等。Shell编程语言简单易学,任何在提示符中能键入的命令都可以放到一个可执行的Shell脚本中。
1.3 Shell的种类
Linux(Unix或类Unix)中的Shell有多种类型,其中最常用的种类有Bourne Shell(sh)、C Shell、Korn Shell。这三种Shell各有优缺点。
- Bourne Shell是UNIX最初使用的Shell,并且在每种UNIX上都可以使用。Bourne Shell在Shell编程方面相当优秀,但是在处理与用户的交互方面做的不如其它几种Shell。
- Bourne-Again Shell(bash)是 Linux系统中最常用的Shell。它是Bourne Shell的扩展,与Bourne Shell完全向后兼容,并且在Bourne Shell的基础上增加、增强了很多特性,具有很多特色,可以提供如命令补全、命令编辑和命令历史等功能,它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编程接口,同时又有很有好的用户界面。
- C Shell(csh)C Shell是一种比Bourne Shell更适于编程的Shell,它的语法和用法和C语言很相似,Linux为喜欢使用C Shell编程的人提供了TCSH。
- TCSH是与C Shell兼容的增强版本。它包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法。
- Korn Shell(ksh)集合了C Shell和Bourne Shell的优点,并和Bourne Shell完全兼容。Linux系统提供了ksh的扩展,它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。
Linux中还包括了一些其它的Shell类型,如比较流行的ash和zsh等。但无论哪一种Shell,它最主要的功用都是解译使用者在命令行提示符中输入的指令。在MS-DOS中,也有一种Shell,它的名字是COMMAND.COM,它也用于同样的工作,只是它显然没有Linux Shell这样强大。每种Shell都有它的用途及各自的命令语法和提供不同的内建功能。有些Shell是有专利的,有些则可从互联网上直接免费获得。
我们可以使用如下命令查看系统中所有可用的Shell:
[root@hadoop102 etc]# cat shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh
我们看到此文件中包含了多行,每行都是一种Shell,它代表此系统支持多种Shell。那么如何去选择使用哪种shell呢?
用户登录到Linux系统时由/etc/passwd这个文件决定用户将要使用哪种Shell,比如我们来查看root账号在/etc/passwd这个文件中的定义:
[root@hadoop102 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
我们可以看到在输出结果中,以冒号“:”分隔的最后一个字段就是定义此账号在登录后所使用的Shell,由此可知此实例中,root账号所使用的Shell是bash。
我们还可以使用如下命令来查看账号当前使用的Shell的类型:
[root@hadoop102 ~]# echo $SHELL /bin/bash
或者:
[root@hadoop102 ~]# ps -p $$ PID TTY TIME CMD 1985 pts/0 00:00:00 bash
1.4 怎样使用Shell
要使用Shell,你只需简单的输入命令即可,命令即是一个用于执行特定任务的计算机程序。
如果你的系统启动后进入的是文本模式,那么当你登录系统后就可以直接使用Shell,你可以在登录后的Shell中输入命令并执行(命令是为执行特定任务而构建的计算机程序)。
如果你的系统是以图形界面的模式启动的,例如GNOME桌面或是KDE桌面,那么你可以在图形界面中点击“应用程序->系统工具->终端”来打开一个Shell。或者,你可以按“Ctrl-Alt-F1”切换到虚拟控制台并使用你的用户名和密码登陆。若想切换回图形界面模式,可以简单地按“Alr-F7”。
Linux终端提供了一个让你简单地与你的Shell(例如bash)交互的手段。Shell不过是一个解释并执行你在命令行提示符中输入的命令的程序。当你启动GNOME、KDE或X Window终端时,这些应用程序启动你的系统账号中所指定的默认Shell。你可以随时切换到不同的Shell。
1.4.1 使用shell提示符
当普通用户成功登录,系统将执行一个Shell程序,Shell进程会提供一个命令行提示符。作为默认值,普通用户用“$”作提示符,超级用户(root)用“#”作提示符。一旦出现了Shell提示符,就可以键入命令名称及命令所需的参数,键入回车后,Shell将执行这些命令。
1.4.2 运行原理
在Shell执行命令时,Shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如date和cat,也可以是购买的商业程序,如rtds,或是自由软件,如emacs),Shell在搜索路径里寻找这些应用程序(搜索路径是一个存放可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在搜索路径里没有找到这个可执行文件,Shell将会显示一条错误信息。如果能够成功找到命令,该命令将被分解为系统调用并传给Linux内核。
1.4.3 Shell快捷键
在Shell下,你可以使用如下按键组合来编辑和回调命令:
- CTRL + W:删除光标位置前的单词
- CTRL + U:清空行
- ↑,↓方向键:查看命令历史
- Tab:自动补全文件名、目录名和命令等等
- CTRL + R:搜索先前使用的命令
- CTRL + C:中止当前命令
- CTRL + D:退出登录Shell
- ESC + T:调换光标前的两个单词
1.4.4 退出登录
当用户准备结束登录对话进程时,可以键入logout命令、exit命令或CTRL+D,结束登录。
1.5 Shell脚本是什么?
Shell脚本就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易的就能够一个操作执行多个命令,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,它提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以Shell来写程序,比用其他编程语言编写的程序效率更高,毕竟它使用了Linux/Unix下的命令。
Shell脚本是利用Shell的功能所写的一个程序,这个程序是纯文本文件格式,将一些shell的语法与指令写在里面,然后用正则表达式,管道命令以及数据流重定向等功能,以实现我们所需要的功能。
- Shell脚本是Linux/Unix编程环境的基本组成部分。
- Shell脚本一般由以下几部分构成:
- Shell关键字 - 例如if…else,for do…done
- Shell命令 - 例如export,echo,exit,pwd,return
- Linux命令 - 例如date,rm,mkdir
- 文本处理功能 – 例如awk,cut,sed,grep
- 函数 – 通过函数把一些常用的功能放在一起。例如,/etc/init.d目录中的大部分或全部系统Shell脚本所使用的函数都包含在文件/etc/init.d/functions中。
[li@hadoop102 ~]$ cd /etc/init.d [li@hadoop102 init.d]$ cat functions |more
- 控制流语句 – 例如if…then…else或执行重复操作的Shell循环。
每个Shell脚本都有它的用途,例如,备份文件系统和数据库到网络存储服务器。Shell脚本可以像Linux下的一个命令一样被执行。
1.6 为什么使用Shell脚本?
Shell脚本的应用知识对于每一个想熟练地管理Linux操作系统的人是必须的,即使你可能从来不必写脚本。比方说在Linux机器启动时,它执行/etc/rc.d目录中的Shell脚本来加载系统配置和运行服务,那么详细的理解这些启动脚本对于我们分析系统的行为或是可能修改这些脚本将是很重要的。
学习编写Shell脚本并不难,因为它的语法简单易懂,类似于直接调用命令行的功能并串联在一起,并且只有几种规则需要学习。大部分简短的脚本可以第一次就正确执行,即使要调试长的脚本也是简单的。
总的来说,我们使用Shell具有如下一些原因:
- 使用简单
- 节省时间:可以把冗长的重复的一连串命令合并成一条简单的命令
- 可以创建你自己的自动化工具和应用程序
- 使系统管理任务自动化
- 因为脚本经过很好的测试,所以使用脚本做类似配置服务或系统管理任务的时,发生错误的机会将大大减少
- 我们经常会用到Shell脚本的实例有:
- 监控你的Linux系统
- 备份数据和创建快照
- 创建邮件告警系统
- 查找耗尽系统资源的进程
- 查找是否所有的网络服务都正常运行等等
1.7 与bash手册交互
获得命令帮助的方法,如下表:
命令 | 说明 | 举例 |
help内置命令 | 使用help命令查看指定的Shell内置命令的使用方法 | help history |
命令名 --help | 使用--help命令查看指定命令的用法摘要和参数列表 | ls --help |
whatis命令名 | 使用whatis命令获得指定命令的简要功能描述 | whatis ls |
man命令名 | 使用man命令查看指定命令的手册 | man ls |
info/pinfo命令名 | 使用info或pinfo命令查看指定命令的GUN项目文档 | info ls |
man -k <关键字> | ||
apropos <关键字> | 列出所有与<关键字>匹配的手册页 | man -k selunx |
大多数Linux发行版自带在线手册,可以查找shell命令以及其他GUN实用工具的相关信息。man命令可以访问Linux系统的手册页。在man命令之后跟上想要查看的命令名,就可以显示相应的手册页。示例如下:
man houstname
当使用man命令查看命令手册页的时候,其中的信息是由分页程序(pager)来显示的。分页程序是一种实用工具,能够逐页(或逐行)显示文本。单击空格键进行翻页,或使用enter键逐行查看。也可以使用箭头键向前和向后滚动手册页的内容,如果阅读完毕,可以使用q键退出手册页,然后会重新获得shell CLI提示符。
内置命令获取帮助说明内置命令有自己的帮助页面。有关帮助页面的更多信息,可以输入help。
与外部命令不同,内建命令无须使用子进程来执行。内建命令已经和shell编译成一体,作为shell的组成部分存在,无须借助外部程序文件来执行。
可以使用 type 来确定一个命令是否是内建命令:
[li@hadoop102 ~]$ type cd cd 是 shell 内嵌
系统变量 $PATH 变量包含的目录中几乎聚集了系统中绝大多数的可执行命令,它们都是外部命令。
通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前 Shell 进程的一个函数。
下表列出了 Bash Shell 中直接可用的内建命令。
命令 说明
: 扩展参数列表,执行重定向操作
. 读取并执行指定文件中的命令(在当前 shell 环境中)
alias 为指定命令定义一个别名
bg 将作业以后台模式运行
bind 将键盘序列绑定到一个 readline 函数或宏
break 退出 for、while、select 或 until 循环
builtin 执行指定的 shell 内建命令
caller 返回活动子函数调用的上下文
cd 将当前目录切换为指定的目录
command 执行指定的命令,无需进行通常的 shell 查找
compgen 为指定单词生成可能的补全匹配
complete 显示指定的单词是如何补全的
compopt 修改指定单词的补全选项
continue 继续执行 for、while、select 或 until 循环的下一次迭代
declare 声明一个变量或变量类型。
dirs 显示当前存储目录的列表
disown 从进程作业表中刪除指定的作业
echo 将指定字符串输出到 STDOUT
enable 启用或禁用指定的内建shell命令
eval 将指定的参数拼接成一个命令,然后执行该命令
exec 用指定命令替换 shell 进程
exit 强制 shell 以指定的退出状态码退出
export 设置子 shell 进程可用的变量
fc 从历史记录中选择命令列表
fg 将作业以前台模式运行
getopts 分析指定的位置参数
hash 查找并记住指定命令的全路径名
help 显示帮助文件
history 显示命令历史记录
jobs 列出活动作业
kill 向指定的进程 ID(PID) 发送一个系统信号
let 计算一个数学表达式中的每个参数
local 在函数中创建一个作用域受限的变量
logout 退出登录 shell
mapfile 从 STDIN 读取数据行,并将其加入索引数组
popd 从目录栈中删除记录
printf 使用格式化字符串显示文本
pushd 向目录栈添加一个目录
pwd 显示当前工作目录的路径名
read 从 STDIN 读取一行数据并将其赋给一个变量
readarray 从 STDIN 读取数据行并将其放入索引数组
readonly 从 STDIN 读取一行数据并将其赋给一个不可修改的变量
return 强制函数以某个值退出,这个值可以被调用脚本提取
set 设置并显示环境变量的值和 shell 属性
shift 将位置参数依次向下降一个位置
shopt 打开/关闭控制 shell 可选行为的变量值
source 读取并执行指定文件中的命令(在当前 shell 环境中)
suspend 暂停 Shell 的执行,直到收到一个 SIGCONT 信号
test 基于指定条件返回退出状态码 0 或 1
times 显示累计的用户和系统时间
trap 如果收到了指定的系统信号,执行指定的命令
type 显示指定的单词如果作为命令将会如何被解释
typeset 声明一个变量或变量类型。
ulimit 为系统用户设置指定的资源的上限
umask 为新建的文件和目录设置默认权限
unalias 刪除指定的别名
unset 刪除指定的环境变量或 shell 属性
wait 等待指定的进程完成,并返回退出状态码
内建命令使用help获取帮助页面:
[li@hadoop102 ~]$ help echo echo: echo [-neE] [参数 ...] 将参数写到标准输出。 在标准输出上显示 ARG 参数后跟一个换行。 选项: -n 不要追加换行 -e 启用下列反斜杠转义的解释 -E 显式地抑制对于反斜杠转义的解释 `echo' 对下列反斜杠字符进行转义: \a 警告(响铃) \b 退格 \c 抑制更多的输出 \e 转义字符 \f 格式提供 \n 换行 \r 回车 \t 横向制表符 \v 纵向制表符 \\ 反斜杠 \0nnn 以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是 0到3个八进制数字 \xHH 以 HH (十六进制)为值的八比特字符。HH可以是 一个或两个十六进制数字 退出状态: 返回成功除非有写错误发生。
在命令概要部分中,很多命令采用的基本模式如下:
COMMAND-NAME [OPTION] ... [ARGUMENT] ...
- COMMAND-NAME:是要运行的命令名;
- OPTION:是用于修改命令行为的选项。可添加的OPTION(也称作开关)通常不止一个。中括号[ ] 表示OPTION是可选的。并且可以选多个。
- ARGUMENT是传递给命令的参数,以指明命令的操作对象。中括号看出也不是必须的,也可以一次指定多个。
提示:如果想使用多个命令选项,那么通常可以将其合并在一起。例如:要使用选项 -a 和 -b,可以写作 -ab。
手册页并非唯一的参考资料。还有另一种称作info页面的信息。可以输入info info来了解info页面的相关内容。
内建页面有自己的帮助页面。有关帮助页面的更多信息,可以输入help help。另外,大多数命令接受-h 或 --help选项。例如,可以输入hostname --help来查看简要的帮助信息。
1.8 文件及Linux目录结构
1.8.1 文件
Linux系统下的文件类型包括:
- 普通文件(-)
- 目录(d)
- 符号链接(l)
- 字符设备文件(c)
- 块设备文件(b)
- 套接字(s)
- 命名管道(p)
1.8.2 Linux文件系统
Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照其访问路径一一列出。
常见的Linux目录名如下表:
目 录 | 用 途 |
/ | 虚拟目录的根目录 |
/bin | 二进制文件目录,存放了很多实用级的GUN使用工具 |
/boot | 引导目录,存放引导文件 |
/dev | 设备目录,Linux在其中创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录,Linux在其中创建用户目录(可选) |
/lib | 库目录,存放系统和应用程序库文件 |
/lib64 | 库目录,存放系统和应用程序库文件 |
/lost+found | 存放一些系统检查结果,发现不合法的文件或数据都存放这里,通常此目录是空的,除非硬盘遭受了不明的损坏 |
/media | 媒介目录,可移动存储设备的常用挂载点 |
/mnt | 挂载目录,用于临时挂载文件系统的常用挂载点 |
/opt | 可选目录,存放第三方软件包 |
/proc | 进程目录,存放现有内核、系统以及进程的相关信息,是一个虚拟文件系统, |
/root | root用户的主目录(可选) |
/run | 运行目录,存放系统的运行时数据 |
/sbin | 系统二进制文件目录,存放了很多管理级的GUN使用工具 |
/srv | 服务目录,存放本地服务的相关文件 |
/sys | 系统目录,存放设备、驱动程序以及部分内核特征信息 |
/tmp | 临时目录,可以在其中创建和删除临时工作文件 |
/usr | 用户目录,一个次目录层级结构 |
/var | 可变目录,存放经常变化的文件,比如日志文件 |
/usr目录值得特别关注,因为该目录是一个次目录层级结构,包含共享的只读文件。会在其中发现用户命令、源代码文件、游戏、等等。
主目录是分配给用户账户的一个特有目录。创建用户时,系统通常会为其分配主目录。
1.8.2 遍历目录
在Linux文件系统中,可以使用目录切换(cd)命令来将shell会话切换到另一个目录。cd命令的语法结构非常简单:
cd destination
cd命令可以接受单个参数destination,用以指定你想切换到的目录名。如果没有为cd命令指定目标路径,则会切换到用户目录。
destination参数可以用两种方式表示:一种是绝对路径,另一种是相对路径。
- 绝对路径
绝对路径定义了在虚拟目录结构中,该目录从根开始的确切位置,相当于目录的全名。绝对路径总是以正斜线(/)作为起始,以指明虚拟文件系统的根目录。绝对路径可以清洗明确地表明用户想切换到的确切位置。要用绝对路径来到达文件系统中的某个特定位置,用户只需要在cd命令后指定完整的路径名即可:
cd /usr/bin
可以使用shell命令中的pwd命令显示shell会话的当前目录,该目录被称为当前工作目录。pwd命令并无参数,直接使用即可。
pwd
返回当前工作目录的绝对路径。
但有时绝对路径会显得冗长,因此有一种更简单的解决方法,相对路径。
- 相对路径
相对路径允许指定一个基于当前位置的目标路径。相对路径并不以代表根目录的正斜杠(/)开头,而是以目录名(如果你准备切换到当前工作目录下的某个目录的话)或是一个特殊字符开始。如果位于home目录中,希望切换到到Docunments子目录,那么可以使用cd命令配合相对路径:
cd Documents
可以在任何包含子目录的目录中使用带有相对路径的cd命令,也可以使用特殊字符来表示相对目录位置。
有两个特殊字符可用于相对路径中:
- 单点号(.):表示当前目录;
- 双点号(..):表示当前目录的父目录。
1.9 小结
我们来总结一下,这一章我们都学习哪些知识:
- Linux是自由开源的类Unix操作系统。该操作系统的内核是由莱纳斯·托瓦兹在1991年10月5日首次发布。
- Linux既可以作为服务器操作系统使用,也可以作为个人计算机的独立操作系统使用。
- Linux内核,即Linux操作系统的核心。它的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
- Linux的主要理念:一个程序只做一件事并做好、一切皆文件、小即是美、在文本文件中存储配置和数据、可移植性高于效率、简单美观。
- Linux Shell是用户和Linux内核之间的接口程序,为用户提供使用操作系统的接口。
- Linux中最常用的Shell有Bourne Shell(sh)、C Shell(csh)、Korn Shell(ksh)。
- 如果你的系统启动后进入的是文本模式,那么当你登录系统后就可以直接使用Shell。
- Shell脚本是使用纯文本文件,集合了一些Shell的语法和指令,并用正则表示法或管道命令以及数据流重导向等功能,达到我们想要的处理目的的程序。
- Shell脚本具有使用简单、节省时间、使系统管理自动化等特点。
1.10 作业
制作下载安装虚拟机的md文档,文档内容要求
- 下载VMware Workstation的网站;
- 安装VMware Workstation的详细流程,截图以及每个步骤的说明;
- 下载CentOS7的ISO文件,版本:CentOS-7-x86_64-DVD-2009.iso,下载网址;
- 安装CentOS7的详细流程,截图以及每个步骤的说明;
- 下载安装远程控制工具:MobaXterm或xshell。
将md文档命名为自己的班级+名字,例如:21云计算1班xxx。
下周周日晚8点交。