##Linux基础篇

前言:

若盛开 清风自来 心若浮沉 浅笑安然 

这句话出自三毛的随笔 原句是∶

岁月极美 在于它必然的流逝 春花 秋月 夏日 冬雪 你若盛开 清风自来 心若浮沉 浅笑安然 

译文是如果你足够优秀  一切都会好起来的 有平稳的心态 坦然面对世事 

心态是一种意境 得之坦然失之则淡然 

笑口常开 好彩自然来!

不要把失去当成理所应当 从自身找找原因 当你足够优秀 摆正你的心态 一切问题也就不再是问题 好好提升自己 让自己越来越优秀 成为那朵散发魅力的花 

一、Shell介绍

Shell中文意思贝壳 寓意类似内核的壳 Shell是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 简而言之就是只要能够操作应用程序的接口都能够称为SHELL 狭义的shell指的是命令行方面的软件 广义的SHELL则包括图形界面

1.png

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

1)概念

POSIX(Portable Operating System Interface 可移植操作系统接口)是操作系统为应用程序提供的接口标准

简单来说 POSIX(主要是解决了应用程序在各个操作系统上兼容性这样一个普遍的存在的问题 只要一个应用程序的开发是为了在一个实现了POSIX模式的操作系统上运行 那么这个应用程序就可以在所用实现了POSIX模式的操作系统上运行

2)POSIX定义

POSIX:(Portable Operating System Interface of Unix. 可移植操作系统接口)X表示其是对Unix API的传承

POSIX标准由IEEE(电气和电子工程师协会)发布 定义了操作系统应该为应用程序提供的接口标准 是IEEE为要在各种UNIX操作系统上运行软件而定义的一系列API标准的总称

简单可以理解POSIX标准是为操作系统设计API时遵循的规范 一套规范的系统调用集

3)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标准

4)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===》主机名

~===》当前所在的路径


创建普通系统用户

[root@xxx ~]# useradd fly

交互式设置密码

[root@xxx ~]# passwd fly

Changing password for user fly.

New password: 123

BAD PASSWORD: The password is shorter than 8 characters

Retype new password: 123

passwd: all authentication tokens updated successfully.

非交互式设置密码

[root@xxx ~]# echo "123" | passwd --stdin fly

三、shell命令语法

命令语法的3部分

   1、命令:要执行的操作(必选)

   2、选项:如何具体执行操作 通常以-,--,+开头(可选)

   3、参数:具体操作的对象(可选)

示例1

ls

ls /root

ls -l /root

示例2

[root@web02 ~]# date

Wed Nov 25 16:27:16 CST 2020

[root@web02 ~]# date +%F

2020-11-25

[root@web02 ~]# date -s "2022-11-11 11:11:11"

Fri Nov 11 11:11:11 CST 2022


示例3

[root@web02 ~]# cat /etc/redhat-release 

CentOS Linux release 7.8.2003 (Core)

[root@web02 ~]# uname -r

3.10.0-1127.el7.x86_64

[root@web02 ~]# uname -m

x86_64

[root@web02 ~]# uname -a

Linux web02 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux