Fork me on GitHub

-linux-初识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-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。 
//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系统的管理例如: 
1. 文件管理 
2. 用户与权限管理 
3. 进程管理 
4. 磁盘管理 
5. 网络管理 
6. 软件管理

2、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等等,Shell Script大致都类同,即命令大都通用。当您学 会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种 Shell上使用。 
bash是大多数Linux系统以及Mac OS X v10.4默认的shell,bash具有极强的可移植性,它能运行于大多 数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows 的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是Bourne shell命令语 法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊 变量或使用了Bourne的内置命令的脚本才需要修改。 
bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录 栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法: $(...)。GNU bash作为一个交互式的 shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。

posix:

// 一:简单来说: POSIX(Portable Operating System Interface,可移植操作系统接口),是操作系统为应用程序提 供的接口标准。 简单的说, POSIX(主要是解决了应用程序在各个操作系统上兼容性这样一个普遍存在的问题。只要一个应 用程序的开发是为了在一个实现了POSIX模式的操作系统上运行,那么这个应用程序就可以在所用实现了 POSIX模式的操作系统上运行。 
// 二: //1、POSIX定义 POSIX: Portable Operating System Interface of Unix.,可移植操作系统接口。X表示其是对 Unix API的传承。 POSIX标准由IEEE(电气和电子工程师协会)发布,定义了操作系统应该为应用程序提供的接口标准,是 IEEE为要在各种UNIX操作系统上运行软件而定义的一系列API标准的总称。 简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集。 
  //2、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 windows NT, Linux等都支持或者部分支持POSIX标准。 
  //3、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

ls
ls /root 
ls -l /root

# 查看子文件

例2

[root@centos-linux ~]# date
2020年 11月 19日 星期四 18:01:41 CST
    
[root@centos-linux ~]# date +%F
2020-11-19

[root@centos-linux ~]# date -s 16:14:00
2020年 11月 19日 星期四 16:14:00 CST
[root@centos-linux ~]# date
2020年 11月 19日 星期四 16:14:08 CST
# 设置时间

[root@centos-linux ~]#  date -s "2022-11-11 11:11:11"
2022年 11月 11日 星期五 11:11:11 CST
# 年月日时分秒重置


例3

[root@centos-linux ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
# 查看操作系统版本

[root@centos-linux ~]# uname -r
3.10.0-1160.el7.x86_64

[root@centos-linux ~]# uname -m
x86_64
# 只查看最后的参数

[root@centos-linux ~]# uname -a
Linux centos-linux.shared 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

四 bash解释器特性

1. 命令和文件自动补全

​ 注意:Tab只能补全命令和文件

[root@centos-linux ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 

2 快捷键

^c 终止前台运行的程序 
^d 退出 等价exit 
^l 清屏 
^a 光标移到命令行的最前端 
^e 光标移到命令行的后端 
^r 搜索历史命令,利用关键词 
Alt+. 引用上一个命令的最后一个参数,等价于!$

3 历史命令

-1.查看命令
[root@centos-linux ~]# history 

-2.清空历史命令
[root@centos-linux ~]# history -c

-3.查看当前用户的历史命令保存文件,需要重新打开终端才被写入
[root@centos-linux ~]# cat ~/.bash_history 

-4、历史命令默认保存1000条,可以修改/etc/profile中的HISTSIZE=2000

-5.查找历史命令并运行
(1)光标上下键 
(2)^r 					//搜索历史命令(输入一段某条命令的关键字:必须是连续的) 
(3)!220 				//执行历史命令中第220条命令 
(4)!字符串 			//搜索历史命令中最近一个以xxxx字符开头的命令,例如!ser 
(5)!$ 					//引用上一个命令的最后一个参数

4 别名

-1.查看系统当前别名
[root@centos-linux ~]# alias

-2.建立别名
[root@centos-linux ~]# alias egon='ls'

-4.默认root字符带颜色
[root@centos-linux ~]# grep root /etc/passwd
[root@centos-linux ~]# alias grep
alias grep='grep --color=auto'

五 命令查找优先级

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 
'''
然后以for作为一个命令的别名,此时该for函数不能执行,因为alias优先级较高。
'''
函数例如 
function f(){ echo 123; },注意{}左右两边有空格 # ps:查看命令的位置:which 命令

六 查看帮助信息

1 man手册

-1.简单使用
[root@centos-linux ~]# man

-2.详解如下
man 手册名,例如man ls 
搜索:/-h n N 
技巧一:按章节来查找,常用的是1(命令用法),5(文本规范),8(系统管理命令) 
/usr/bin/passwd 			命令,修改用户密码 man 1 passwd 
/etc/passwd 					保存用户信息的文件 man 5 passwd 
/etc/exports 					man exports man 5 exports 

技巧二:按关键字检索(适合记不住手册的全名时使用) 
man -k "_selinux" 		手册名或手册描述中包含关键字_selinux 
注:从whatis数据库里找(# makewhatis) 

技巧三:在所有章节中查询 
# man -a passwd
# man -f passwd

2 --help或者help命令

命令 --help

help 命令

[root@xxx ~]# ls --help

用法:ls [选项]... [文件]...

ls 常见选项

  • -a all,查看目录下的所有文件,包括隐藏文件
  • -l 长列表显示
  • -h human 以人性化方式显示出来
  • -d 只列出目录名,不列出其他内容
  • -t 按修改时间排序
  • -r 逆序排序
  • -i 修改文件的inode号(索引号)

七 常用命令

设置主机名

[root@arther-linux ~]# hostnamectl set-hostname arther-linux
# 退出重新进入 即可看到

设置默认启动级别

[root@arther-linux ~]# systemctl set-default graphical.target
# 图形界面

[root@arther-linux ~]# systemctl set-default multi-user.target 
# 字符终端

查看ip地址

# 查看
ifconfig # 也可以执行ip address或者简写ip a 
ifconfig eth0 # 也可以执行ip a show eth0

设置时间

[root@arther-linux ~]# date --help

# 查看时间
[root@arther-linux ~]# date

# 设置时间
  #date -s "2018-05-17 09:51:50" 
  或者
  # timedatectl set-time '16:10:40 2022-11-12 13:14:15'
  
// =============》date设置的是系统时间,实际上时间分为硬件时钟与系统时钟两种 
#1、硬件时钟:硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于 CMOS中。 #2、系统时钟:系统时钟则是指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 hardware clock (RTC))。RTC=Real Time Clock,也就是硬件时钟。在Linux中有硬件时钟与系统 时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指 kernel中 的时钟。
所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会 存在差异。根据不同参数设置,hwclock命令既可以将硬件时钟同步到系统时钟,也可以将系统时钟同步到硬 件时钟。

// hwclock命令的参数 
-r, --show 读取并打印硬件时钟 
-s, --hctosys 将硬件时钟同步到系统时钟 
-w, --systohc 将系统时钟同步到硬件时钟

// =============》时间服务器 注意:要使系统时间准确,最好还是使用ntp方式,即将Linux系统时钟同步到远程NTP服务器,ps: centos7用chrony替换ntp,此处暂作了解: https://www.cnblogs.com/linhaifeng/articles/13471989.html 
  
NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。 timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。 
注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。 

使用ntpdate命令从网络同步时间,再同步到硬件时钟 ntpdate命令是使用NTP协议来从网络同步时间的命令。NTP=Network Time Protocol 网络时间协议。 

#系统中默认没有ntpdate命令,需要自行下载安装 
[root@localhostt ~]# yum install ntpdate -y

# 与网络时间服务器同步时间 
[root@localhost ~]# ntpdate 0.cn.pool.ntp.org 
12 Aug 21:04:14 ntpdate[10099]: step time server 203.107.6.88 offset -7826995.450514 sec [root@localhost ~]# date 
[root@localhost ~]# hwclock -w

# 注意: 
1、必须有 root 权限才能在主机上运行这个命令。 
2、如果NTP服务器守护程序在当前主机上运行,命令将拒绝ntpdate设置日期 
3、让系统自动同步时间,只需添加一条定时任务即可,后期会介绍到 
# 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 
要开始自动时间同步到远程NTP服务器,在终端键入以下命令。 
# timedatectl set-ntp true 
要禁用NTP时间同步,在终端键入以下命令。 
# timedatectl set-ntp false

重启时间失效

关闭默认的时间同步,然后再进行设置 # timedatectl set-ntp no

设置时区

查看
# timedatectl status 

列出可用时区 
# timedatectl list-timezones 

设置
# timedatectl set-timezone "Asia/Shanghai" 
# timedatectl set-timezone UTC

重启

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 // 立即停止系统,并且关闭电源

取消正在进行的关机或重启

shutdown -c

注销的账号

exit 
logout 
ctrl+d
posted @ 2020-12-11 19:09  artherwan  阅读(170)  评论(0编辑  收藏  举报