初识shell之系统命令基础
一 shell介绍
基础介绍
Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用程序的接口都能够称为SHELL。狭义的shell指的是命令行方面的软件,广义的SHELL则包括图形界面。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux
的桥梁。Shell 既是一种命令语言,又是一种程序设计语
言。
所以说,shell可以指代两层意思: 1、命令解释器
python语言 《--------------------------------》shell命令
python解释器《------------------------------》shell解释器
操作系统《------------------------------------》操作系统
计算机硬件《---------------------------------》计算机硬件
sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。bash(Bourne-AgainShell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼对sh的兼容,是各种
Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
dash (Debian Almquist shell)一种 Unixshell。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少。它由NetBSD版本的Almquistshell (ash)发展而来,于1997年由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为dash。
//sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。
//sh 跟bash的区别,实际上是bash有没开启POSIX模式的区别。
//简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix。
//在Linux系统上/bin/sh往往是指向/bin/bash的符号链接
//ln -s /bin/bash /bin/sh
我们可以SHELL实现对Linux系统的管理例如:
- 文件管理
- 用户与权限管理
- 进程管理
- 磁盘管理
- 网络管理
- 软件管理
shell脚本介绍
Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发shell 自身。
GNU bash
Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,ShellScript大致都类同,即命令大都通用。当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。bash是大多数Linux系统以及Mac OS X v10.4默认的shell,bash具有极强的可移植性,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了MicrosoftWindows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell (ksh) 和 Cshell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法:$(…)。GNU bash作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。
posix
一:简单来说:
POSIX(Portable Operating System Interface,可移植操作系统接口),是操作系统为应用程序提供的接口标准。简单的说, POSIX(主要是解决了应用程序在各个操作系统上兼容性这样一个普遍存在的问题。只要一个应用程序的开发是为了在一个实现了POSIX模式的操作系统上运行,那么这个应用程序就可以在所用实现了POSIX模式的操作系统上运行。
二:
- POSIX定义
POSIX: Portable Operating System Interfaceof Unix.,可移植操作系统接口。
X表示其是对Unix API的传承。POSIX标准由IEEE(电气和电子工程师协会)发布,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行软件而定义的一系列API标准的总称。简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集。
-
POSIX的诞生/解决的问题POSIX的诞生和Unix的发展是密不可分的。当年最早的Unix,源代码流传出去了,加上早期的Unix不够完善,于是之后出现了好些独立开发的与Unix基本兼容但又不完全兼容的OS,通称Unix-like OS。这样版本混乱的情况导致相互之间的竞争和不兼容之处越来越多,给软件的可移植性带来很大困难,对Unix的发展极为不利。
为了提高兼容性和应用程序的可移植性,结束混乱局面,IEEE提出了POSIX标准,POSIX在源代码级别上定义了一组最小的Unix(类unix)操作系统接口。 这套标准涵盖了很多方面,比如Unix系统调用的C语言接口,shell程序和工具、线程和网络编程等。POSIX标准意在期望获得源代码级别的软件可移植性。为一个POSIX兼容的操作系统编写的程序,可以在任何其他POSIX操作系统上编译执行。POSIX现在已经发展成为一个非常庞大的标准族,并不局限于Unix, 一些其他的操作系统,如Microsoft windowsNT, Linux等都支持或者部分支持POSIX标准。 -
POSIX标准的思路问题: 不同操作系统内核为同一功能提供的系统调用(函数)是不同的,例如创建进程,linux下是fork函数,windows下是createprocess函数,如果在Linux下写了一个程序用到了fork函数,要往windows上移植就得把源代码里面的fork通通改成createprocess,然后重新编译。解决方法: 定义POSIX标准, linux和windows实现基于POSIX标准,提供同样的接口,例如定义创建进程的接口为posix_fork(示例名/非真实名字), 且linux和windows都把各自创建进程的调用封装成posix_fork,都声明在unistd.h里。 这样程序员编写应用时,只需包含unistd.h, 调用这个POSIX标准中定义的API接口:posix_fork函数,即可实现源代码级别的可移植。
二 shell交互式环境
登录用户后进入解释器bash的交互式环境,可以敲命令,交互式环境的命令提示符如下
[root@xxx ~]#
#号代表超级管理员用户对应的
命令行[root@xxx ~]$
$号代表普通用户对应的命令行
root
---->当前登录的用户
@
-------->分隔符
xxx
----->主机名
~
-------->当前所在的路径
创建普通系统用户
useradd egon
交互式设置密码
passwd egon
非交互式设置密码
echo "123" | passwd --stdin egon
三 shell命令语法
三部分组成
- 命令:要执行的操作(必选)
- 选项:如何具体执行操作,通常以 -, --, +开头(可选)
- 参数:具体操作的对象(可选)
ps:unix认为命令运行完毕后没有提示便是最好的提
示,即结果正确,linux继承unix的优良传统
例1
例2:ls ls /root ls -l /root
例3:[root@localhost ~]# date 2020年 08月 12日 星期三 16:13:08 CST [root@localhost ~]# date +%F 2020-08-12 [root@localhost ~]# date -s 16:14:00 2020年 08月 12日 星期三 16:14:00 CST [root@localhost ~]# date -s "2022-11-11 11:11:11" 2022年 11月 11日 星期五 11:11:11 CST
[root@egon ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@egon ~]# uname -r 3.10.0-1127.13.1.el7.x86_64 [root@egon ~]# uname -m x86_64 [root@egon ~]# uname -a Linux egon.xxx.com 3.10.0- 1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux [root@egon ~]#
四 bash解释器特性
命令和文件自动补全 注意:Tab只能补全命令和文件
[root@localhost ~]# ls
/etc/sysconfig/network-scripts/ifcfgens33
快捷键
-
控制命令
Ctrl + l
:清屏(与clear命令效果相同)
Ctrl + o
:执行当前命令,并选择上一条命令
Ctrl + s
:阻止屏幕输出(当前正在执行的命令不在打印信息)
Ctrl + q
:允许屏幕输出(使用Ctrl+s命令后,可以用Ctrl+q恢复)
Ctrl + c
:终止当前正在执行的命令
Ctrl + z
:挂起命令,把当前进程转到后台运行,使用fg命令恢复。
Ctrl + d
: 退出当前 Shell S、Q、C、Z 是由终端设备处理的,可用 stty 命令设置。 -
编辑命令,光标移动
Ctrl + a
:移到命令行首
Ctrl + e
:移到命令行尾
Ctrl + f
:前移(向右移动)一个字符
Ctrl + b
:后退(向左移动)一个字符
Alt + f
:前移(向右移动)一个单词
Alt + b
:后退(向左移动)一个单词
Ctrl + xx
:在命令行首和光标之间移动 -
文本修改
补全、删除、粘贴
tab
: 自动补全命令
Ctrl + u
:从光标处删除至命令行首
Ctrl + k
:从光标处删除至命令行尾
Ctrl + w
:从光标处删除至字首
Alt + d
:从光标处删除至字尾
Ctrl + d
:删除光标处(或光标后)的字符(如果光标前后都没有字符,即命令行为空的时候,则会退出shell)
Ctrl + h
:删除光标前的字符(与backspace键相同)
Alt + Backspace
:与 Ctrl + w 类似,分隔符有些差别
Ctrl + y
:粘贴至光标后 -
改变大小写
Alt + c
:从光标处更改为首字母大写的单词
Alt + u
:从光标处更改为全部大写的单词
Alt + l
:从光标处更改为全部小写的单词 -
交换字符、单词位置
Ctrl + t
:交换光标处和之前的字符(ESC+t相同)
Alt + t
:交换光标处和之前的单词 -
重新执行命令
Ctrl + p
:历史中的上一条命令
Ctrl + n
:历史中的下一条命令
Alt + .
:使用上一条命令的最后一个参数(会直接在当前光标位置显示)
Ctrl + r
:搜索之前使用过的命令
Ctrl + g
:从历史搜索模式退出 -
Bang (!) 命令
Bang命令算不上快捷键键,但是使用可以快捷的进行一些操作,比如重新执行之前命令、修改上一条命令并执行等等。
!!
:执行上一条命令
!cc
:执行最近的以cc开头的命令,如!l会执行ls命令
!$
:打印上一条命令的最后一个参数,并回车执行。与Alt + .
相似,但是会自动执行
!*
:上一条命令的所有参数 !cc:p:仅打印以!cc的输出,但不执行,如!l:p会显示ls
!$:p
:打印输出!$的输出
^blah
:删除上一条命令中第一个blah,然后执行
^blah^foo
:将上一条命令中的 blah 替换为 foo,然后执行
^blah^foo^
:将上一条命令中所有的 blah 都替换为 foo,然后执行
历史命令
- 查看历史命令
[root@xxx ~]# history
- 清空历史命令
[root@xxx ~]# history -c
- 历史命令保存文件:
cat ~/.bash_history
- 历史命令默认保存1000条,可以修改
/etc/profile
中的HISTSIZE=2000
- 查找历史命令并运行
- 光标上下键
^r
//搜索历史命令(输入一段某条命令的关键字:必须是连续的)!220
//执行历史命令中第220条命令!字符串
//搜索历史命令中最近一个以xxxx字符开头的命令,例如!ser
!$
//引用上一个命令的最后一个参数[root@xxx home]# ls /root /home [root@xxx home]# cd !$ cd /home [root@xxx home]# ls /root /home [root@xxx home]# touch !$/file1 touch /home/file1
别名
# alias
//查看系统当前的别名
ll='ls -l --color=tty'
# alias egon='ls /etc/sysconfig/networkscripts/'
//建立别名
# unalias egon
取消别名
[root@xxx ~]# grep root /etc/passwd
// 默认有颜色
[root@xxx ~]# alias grep ='grep --color=auto'
给grep输入时自动添加颜色
五 命令查找优先级:
bash shell查找命令顺序:
- 以路径(绝对路径,相对路径)开始命令,例
如:/bin/ls 或 cd /bin; ./ls
alias
别名Compound Commands
function
build_in
,如cd
,kill
,pwd
、alias
、echo
等,可以用type -a 命令
查看hash
$PATH
,环境变量,查看环境变量
echo $PATH
,例如/bin/ls
error: command not found
- 复合命令例如
for((i=0;i<=3;i++))do echo 123;done
- 函数例如
function f(){ echo 123; }
,注意{}左右两边有空格 - ps:查看命令的位置:which 命令 whereis 命令
六 查看帮助信息
man手册
- 简单使用
man 命令
- 详解如下
man 手册名
,例如man ls
搜索:/ 指令
如/ -h
表示查找指令-h
的帮助文档 ,按n
查找下一个,N
查找上
一个- 技巧一:按关键字检索(适合记不住手册的全名时使用)
man -k "_selinux"
//手册名或手册描述中
包含关键字_selinux
注:从whatis数据库里找(# makewhatis) - 技巧二:在所有章节中查询
# man -a passwd
# man -f passwd
- 技巧一:按关键字检索(适合记不住手册的全名时使用)
–help或者help命令
命令 --help
help
命令
例:
[root@xxx ~]# ls --help
用法:ls [选项]... [文件]...
ls
常见选项
-a all
,查看目录下的所有文件,包括隐藏文件
-l
长列表显示
-h human
以人性化方式显示出来
-d
只列出目录名,不列出其他内容
-t
按修改时间排序
-r
逆序排列
-i
显示文件的inode号(索引号)
info
非常详细的显示命令的说明信息
官方手册
http://man.linuxde.net
baidu, google
七 常用命令
设置主机名
[root@iZm5e59rizbgmmp4net6zbZ ~]# hostnamectl set-hostname aliyun
// 退出重新进入即可看到
设置默认启动级别
[root@iZm5e59rizbgmmp4net6zbZ ~]# systemctl set-default graphical.target
// 图形界面
[root@iZm5e59rizbgmmp4net6zbZ ~]# systemctl set-default multi-user.target
// 字符终端
查看ip地址(设置ip地址会在网络配置章节里详细介绍)
ifconfig
为centos6版本使用
centos7以上的版本执行ip address
或者简写ip a
ifconfig eth0
为centos6版本使用
centos7以上的版本执行ip a show eth0
设置时间
[root@aliyun ~]# date --help
时间命令的帮助文档
查看时间
# date "+%Y_%m_%d %H-%M-%S"
设置时间
# date -s "2018-05-17 09:51:50"
或者
# timedatectl set-time '16:10:40 2022-11-12 13:14:15'
date
设置的是系统时间,实际上时间分为硬件时钟与系统时钟两种
- 硬件时钟: 硬件时钟是指主机板上的时钟设备,也就是
通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中。 - 系统时钟: 系统时钟则是指kernel中的时钟,当Linux启动时
ps:硬件时间默认比系统时间慢8个小时
硬件时钟与系统时钟的关系是:
Linux操作系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
linux系统设置硬件时钟时,提供两种时区选择,
- 一种为本地时区,此时硬件时间与系统时间相同
- 另一种为UTC时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。
以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。
如果要确保时间修改生效可以执行如下命令。
# hwclock –w
这个命令会强制把系统时间写入CMOS
hwclock
命令
hwclock
命令,与clock
命令是同一个命令,主要用来查询和设置硬件时钟(query and set the hardwareclock (RTC))。RTC=Real Time Clock,也就是硬件时钟。在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。根据不同参数设置,hwclock命令既可以将硬件时钟同步到系统时钟,也可以将系统时钟同步到硬件时钟。
hwclock命令的参数
-r
, --show
读取并打印硬件时钟
-s
, --hctosys
将硬件时钟同步到系统时钟
-w
, --systohc
将系统时钟同步到硬件时钟
时间服务器
注意:要使系统时间准确,最好还是使用ntp方式,即将Linux系统时钟同步到远程NTP服务器,
ps:centos7用chrony替换ntp,此处暂作了解:
点击此处看详细时间同步
NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。
注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。
使用ntpdate命令从网络同步时间,再同步到硬件时钟
ntpdate命令是使用NTP协议来从网络同步时间的命令。
NTP=Network Time Protocol 网络时间协议。
系统中默认没有ntpdate命令,需要自行下载安装
[root@localhostt ~]# yum install ntpdate -y
-
与网络时间服务器同步时间
和国内时间服务器同步下时间
ntpdate cn.pool.ntp.org
解析不了域名的话就ping一下,看看返回的ip是啥
ping cn.pool.ntp.org
这里拿到的ip是94.130.49.186
nptp 94.130.49.186
更新完要把时间写入系统
clock -w 或 hwclock -w
-
注意:
- 必须有 root 权限才能在主机上运行这个命令。
- 如果NTP服务器守护程序在当前主机上运行,命令将拒绝ntpdate设置日期
- 让系统自动同步时间,只需添加一条定时任务即可,后期会介绍到
ps: 阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
重启时间失效
关闭默认的时间同步,然后再进行设置
timedatectl set-ntp no
设置时区
查看
timedatectl status
列出可用时区
timedatectl list-timezones
设置
# timedatectl set-timezone "Asia/Shanghai"
更新当前系统时间
# ntpdate ntp1.aliyun.com
将更新的时间保存到系统始终
# hwclock -w
重启
shutdown -r 10
// 10分钟后重启
shutdown -r 0
// 立即重启
shutdown -r now
// 立即重启
shutdown -r 11:30
// 定点重启
init 6
// 立即重启
reboot
// 立即重启
关机
shutdown -h 10
// 10分钟后关机
shutdown -h 0
// 立刻关机
shutdown -h now
// 立刻关机
shutdown -h 11:30
// 定点关机
halt
// 立即停止系统,需要人工关闭电源
poweroff
// 立即停止系统,并且关闭电源
取消正在进行的关机或重启
showdown -c
注销登录的账号
exit
logout
ctrl+d
补充命令:
- cp命令 复制
例:cp 1.txt /usr/local/
- mv命令 移动或重命名
例:
mv 1.txt /usr/local/
(表示将1.txt文件移动到/usr/local/目录下)
mv 1.txt 2.txt
(表示将1.txt文件重命名为2.txt) - mkdir命令 创建目录
例:mkdir test
(表示在当前所处位置创建一个test的文件夹) - rm命令 删除
例:
rm 1.txt
(表示删除1.txt文件,执行过程中会弹出确认)
rm -f 1.txt
(表示强制删除1.txt文件,不会弹出确认)
rm -rf test
(表示删除test目录)