Shell介绍
Shell在中文的意思是壳,寓意是操作系统的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用程序的接口都能够称之为Shell。狭义的Shell指的是命令行方面的软件,广义的Shell则包括图形界面。
Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种解释器,也是一种程序设计语言。通常将使用Shell语言写的程序称之为脚本程序(Shell Script)。
Bash
sh(Bourne Shell)是一个早期的重要Shell,1978年由史蒂夫•伯恩编写,并同Version 7 Unix一起发布。
Bash(Bourbon-Again Shell)是一个为GNU计划编写的Unix Shell。1987年由布莱恩•福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对Sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
Dash(Debian Almquist Shell)是一种Unix Shell。它比Bash小,只需要较少的磁盘空间,但是它的对话性功能也比较少。它由NetBSD版本的Almquist Shell(Ash)发展而来,于1997年由赫伯特•许(Herbert Xu)移植到Linux上,于2002年改名为Dash。
在CentOS 7上查看可以使用哪些Shell可以查看/etc/shells这个文件
[chirou@Chirou ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
Shell交互式环境
用户登录后进入解释器Bash的交互式环境,可以输入命令
[chirou@localhost ~]$ $表示当前登录的是普通用户
[root@localhost ~]# #表示当前登录的是超级用户root
chirou 表示当前登录的用户名
localhost 表示当前的主机名
~ 表示当前所在目录为家目录
Shell命令语法
命令组成格式:
Command [Option1] [Option1]... [Parameter1] [Parameter2]...
Command: 命令(必选)
Option: 选项,命令具体某个功能,根据需要可以有多个。
Parameter:参数,命令操作的对象,也可以有多个。
-
Linux对大小写敏感,大多数命令都是小写。
-
命令选项和参数之间必须要用空格分隔,有多个空格Bash视为一个。
-
使用选项时,通常会在前面加上横杠 - ,如果使用的是长选项则需要加上两个横杠 --,例如ls -a 和 --all,其实它俩指的是一个意思。多个短选项可以组合起来,只写一个横杠 -
[root@Chirou ~]# ls -al [root@Chirou ~]# ls -a -l # 这俩是一个意思
-
命令输入完成后,按下Enter就立即执行。
命令与路径补全
在Linux中可以使用Tab键进行命令和路径的补全。
-
在输入命令的时候使用Tab键,Bash会自动寻找以已键入字符开头的命令。如果有多个相同开头的命令,连按两下Tab键会显示出所有的命令。
-
对于某些特别长的路径,我们在输入的过程中也可以使用Tab键,Bash会寻找当前路径所有以已输入字符开头的文件补全。
Bash常用快捷键
- Ctrl+c:立即停止前台正在运行的程序
- Ctrl+d:退出,相当于exit命令。删除光标后的字符。
- Ctrl+l:清屏,相当于clear命令。
- Ctrl+a:光标移动到命令行的行首
- Ctrl+e:光标移动到命令行的行尾
- Ctrl+u:删除光标所在处至行首的字符
- Ctrl+k:删除光标所在处至行尾的字符
- Ctrl+r:利用关键字搜索命令历史
- Alt+. :引用上一个命令的最后一个参数,想当于!$
- Shift+PageUP/PageDown:如果某些命令的输出特别长,导致前面的内容以不在当前屏幕中,就可以使用这两个快捷键进行上下翻页。
命令历史
Bash会记录用户所有的输入,可以通过history命令来查看记录。history是记录在内存中的,当用户退出或登出shell时,会自动保存到~/.bash_history文件中。登录时,又会从文件中读取到内存。在内存中,历史命令默认能够存储1000条命令,数量是由环境变量HISTSIZE进行控制,HISTSIZE变量存在于/etc/profile中。
- -c:将当前登录shell中的历史记录消除。对history文件没影响。
- -w:将本次登录的历史记录写入命令历史文件中,默认在用户登出时才会写入文件中。
- -r:将命令历史文件中的内容读入到目前shell的history记录中。
- !n :执行历史中第n条命令
- !字符串:执行命令中最近一个以‘字符串’开头的命令。
- !$:引用上一个命令的最后一个参数
命令别名
Bash中为了简化用户输入,可以将一行命令设置一个别名。
alias:查看所有别名
alias a_name='ls /etc/sysconfig/network-scripts/'
#设置别名
unalias a_name
#取消别名
ls
#取消ls的别名
alias命令设置别名是临时设置,登出后即消失。若要永久设置,需要将设置的别名写入~/.bashrc配置文件。
type查看命令类型
Bash解释器自带有一些内置命令。这些命令通过man命令查询帮助手册时,显示的是Bash解释器的手册页,而非命令的手册页。通过type命令就可以查看命令是否输入内置命令。type会显示命令的路径,和which命令类似。
[root@Chirou ~]# type [-tpa] command_name
不加任何选项与参数时,type会显示出name是外部指令还是内置指令
-t :当加入-t参数时,type会将name以底下这些字符显示出它的意义:
file :表示为外部指令;
alias :表示该指令为命令别名所设定的名称;
builtin :表示该指令为bash内建的指令功能;
-p :如果后面接的name为外部指令时,才会显示完整档名;
-a :会由PATH变数定义的路径中,将所有含name的指令都列出来,包含alias
命令查找优先级
Bash 查找命令的顺序:
- 1、以绝对路径或相对路径执行命令
- 2、alias
- 3、Compound Command (复合命令)
- 4、function
- 5、build_in
- 6、hash
- 7、PATH环境变量所包含的路径
- 8、上面都找不到就会报错,command not found
Linux查询帮助信息
--help选项
很多命令可以通过--help选项查看命令的大致用法。
[root@Chirou ~]# ls --help
用法:ls [选项]... [文件]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all 不隐藏任何以. 开始的项目
-A, --almost-all 列出除. 及.. 以外的任何项目
--author 与-l 同时使用时列出每个文件的作者
-b, --escape 以八进制溢出序列表示不可打印的字符
--block-size=SIZE scale sizes by SIZE before printing them; e.g.,
'--block-size=M' prints sizes in units of
1,048,576 bytes; see SIZE format below
man手册页
man是manual的简写。
[root@Chirou ~]# man [-a] command
# 不带选项会直接显示该命令的详细文档
-a:显示所有匹配项
man命令一共有9个章节,通过man 7 man命令可以查看
- 1 普通用户在shell中可以使用的命令的用法
- 2 系统内核可调用的函数与工具等
- 3 一些常用的库文件调用
- 4 查看一些设备文件,通常是/dev下的文件例如:# man 4 null
- 5 配置文档的信息
- 6 内置游戏的玩法
- 7 一些杂项,比如网络协议等
- 8 只有管理员能够执行的文件,例如一些系统管理类命令。
- 9 Linux 内核 API
常用的是1、5、8章节。
info命令
info与man的用途其实差不多,都是用来查询指令详细信息的命令。 但是与man page一口气输出一堆文档不同的是, info page则是将档拆成一个一个的段落,每个段落用自己的页面来撰写,并且在各个页面中还有类似网页的“超链接”来跳到各不同的页面中,每个独立的页面也被称为一个节点(node) 。
不过你要查询的目标资料的说明文件必须要以info的格式来写成才能够使用info的特殊功能(例如超链接)。而这个支援info指令的文件预设是放置在 /usr/share/info/ 这个目录当中的。
help命令
对Bash内置命令无法使用man命令来查看,这时就要使用help命令
[chirou@duorou ~]$ help cd
参考文件/配置模块文件
一般而言,命令或者软件制作者,都会将自己的命令或者软件的说明制作成线上说明文件。但是,毕竟不是每个都需要做成线上说明文件,还有相当多的说明需要额外的文件!这些说明文件一般就放在/usr/share/doc这个目录里。
对于新手用户来说,这些通篇英文的文档可能会大大增加学习Linux的难度,所以一般而言,如果对某些命令不了解,更推荐通过上网找答案。但如果要真正深入理解,还是需要看官方文档才行。
CentOS 7设置默认启动级别
Linux的运行等级设定如下:
0:关机
1:单用户模式,不需要输入账号密码登录进操作系统后就是管理员账号
2:无网络支持的多用户模式
3:有网络支持的多用户模式,命令行界面
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
临时修改运行级别init命令
[chirou@duorou ~]$ init 3 # 修改为命令行界面
在CentOS 6中设置默认启动级别是修改/etc/inittab文件,在CentOS 7中打开此文件发现与CentOS 6不同
按照该文件所说的,runlevels被targets所取代,即CentOS7采用加载target的方式来替代之前的启动级别。其中有两个重要的target:multi-user.target(表示运行级别中的3)与graphical.target(表示运行级别中的3与5级别)。
那么,查看当前运行级别的命令
systemctl get-default
修改默认启动级别为命令行界面
systemctl set-default multi-user.target
修改默认启动级别为图形界面
systemctl set-default graphical.target
重启即生效。
常用命令
hostnamectl设置主机名,重启生效
[root@Chirou ~]# hostnamectl set-hostname chirou
在集群系统中,使用主机名能方便管理员识别每台服务器。
date
查看时间
[chirou@duorou ~]$ date '+%Y-%m-%d %H:%M:%S'
2020-10-20 19:18:25
设置时间
[chirou@duorou ~]$ date -s '2222-1-3 22:22:6'
2222年 01月 03日 星期四 22:22:06 CST
注意,Linux有两个时间,一个是系统时间,是由Linux系统启动后维护的。另一个是硬件时间,硬件时间是指主板上的时钟设备,在BIOS设定的时钟。硬件时间存放于CMOS中。当Linux启动时,Linux系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
Linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,中国使用的是东8区,此时硬件时间与系统时间相同。另一种是UTC时区,就是世界标准时间,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。
为了保证系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约11分钟)进行的,在我们执行date -s 后,如果马上重启机器,修改时间就有可能没有被写入CMOS。
将系统时间写入CMOS
[root@duorou ~]# date -s '2020-2-2 2:2:2'
2020年 02月 02日 星期日 02:02:02 CST
[root@duorou ~]# hwclock
2020年10月20日 星期二 19时54分56秒 -0.416221 秒
[root@duorou ~]# hwclock -w
2020年02月02日 星期日 02时02分31秒 -0.056272 秒
将硬件时间同步给系统时间
[root@duorou ~]# date
2222年 01月 03日 星期四 22:50:35 CST
[root@duorou ~]# hwclock
2020年10月20日 星期二 19时50分19秒 -0.964076 秒
[root@duorou ~]# hwclock -s
[root@duorou ~]# date
2020年 10月 20日 星期二 19:50:35 CST
为了使系统时间准确,最好还是使用ntp方式。Centos7用chrony替换ntp。
NTP(Net Time Protocol)网络时间协议。
使用ntpdate命令从网络同步时间,再同步到硬件时钟。
[root@duorou ~]# date
2020年 02月 02日 星期日 02:07:28 CST
[root@duorou ~]# hwclock
2020年02月02日 星期日 02时07分19秒 -1.033182 秒
[root@duorou ~]# ntpdate ntp1.aliyun.com
20 Oct 20:17:55 ntpdate[2323]: step time server 120.25.115.20 offset 22615794.922528 sec
[root@duorou ~]# date
2020年 10月 20日 星期二 20:18:13 CST
[root@duorou ~]# hwclock -w
[root@duorou ~]# hwclock
2020年10月20日 星期二 20时19分06秒 -0.611573 秒
阿里云提供了7个NTP时间服务器。
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
重启命令
init 6 # 将系统级别设置为6,即重启级别
reboot # 立即重启
shutdown -r 0 # 立即重启,0相当于now
shutdown -r 3 # 3分钟后重启,且会显示在登录用户的当前屏幕中
shutdown -r 8:30 # 会在最近的8点30分重启
关机命令
init 0 # 将系统级别设置为0,即关机级别
halt # 立即关机,但没有切断电源
poweroff # 立即关机
shutdown -h 0 # 立即关机,0相当于now
取消已设定的关机或重启任务
[root@duorou ~]# showdown -c
Linux系统一般作为服务器系统,服务器在生产环境中很少会关机。若要关机,一定要将内存中的数据写入硬盘后再关机。推荐使用shutdown命令,它在关机前会先将内存中的数据写入硬盘,然后再关机。另外只有管理员root权限才能执行关机命令。
注销或登出账号
[root@duorou ~]# exit
[root@duorou ~]# logout
或使用快捷键 Ctrl+d
查看系统版本
cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
查看内核版本
[chirou@duorou ~]$ uname -r
3.10.0-1127.19.1.el7.x86_64
[chirou@duorou ~]$ uname -a
Linux duorou 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux