Linux基础
@lfj
概念辨析
linux其实是指linux内核
而我们通常说的linux是指基于GNU的linux系统,包括四部分:linux内核、GNU工具、图形化桌面环境、应用软件。
系统安装
类型
Linux系统的安装一般有三种类型
- 把自己当前的操作系统完全放弃
- 使用双系统或多系统
- 使用虚拟机安装linux系统
对于初学者来说建议使用第三种
准备
安装前需要准备什么?
- 安装介质和系统。
- 用于安装的空闲设备。
安装介质:可以是空闲的U盘、光盘、硬盘甚至一个文件(对于虚拟机)
系统:即linux发行版,这个有很多种,尽量别从baidu中获得,可以直接找到对应发行版的官网下载,这是十分纯净的,或者使用浙江大学镜像站:http://mirrors.zju.edu.cn/
比如
Fedora的下载官网:Get Fedora
Ubuntu桌面版的下载官网:https://ubuntu.com/download/desktop
CentOS的下载官网:Download CentOS
Debian的下载官网:https://www.debian.org/distrib/
引导安装软件
常见的有Vmware
和Virtual box
,选择其一即可,然后可以根据引导一步步操作,如果你并不清楚,可以上网搜索一些教程
在Vmware中安装ubuntu可以看https://blog.csdn.net/qq_43374681/article/details/129248167
基础知识
CLI & GUI
通常而言,linux有两种操作模式,CLI和GUI,这两种都是可以的,不过更加推荐的是CLI,这对你熟悉命令和掌握linux有很大的帮助。
如果使用CLI的话,一种打开方式是在GUI的情况下,快捷键ctrl+alt+t打开terminal,如果要远程方式登录,需要配置一下,比较常用的有ssh,可以在其它环境下远程访问linux系统
ssh的配置方法:https://blog.csdn.net/qq_47855463/article/details/116655311
runlevel
linux系统运行时有一个运行级别(runlevel),有以下几种:
0 为停机,关闭系统。
1 为单用户模式,就像Windows下的安全模式类似。
2 为多用户模式,但是没有NFS 支持。
3 为完整的多用户模式,是标准的运行级。
4 保留,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可 以切换到这个模式来做一些设置。
5 X Window 系统。
6 为重新重启,运行 init 6 机器就会重启。startx命令
这里介绍几条命令
# 显示当前的运行级别
runlevel
# 更改运行级别 (需要sudo)
init [number]
# 关机
ctrl-D
logout
exit
init 0
shutdown #可以设置定时关机,可以自行查阅
halt
# 重启系统
reboot
shell
shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。 它为用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的 进程的途径。
所有Linux发行版默认的shell都是bash shell。bash 由GNU项目开发,被当作 标准Unix shell
其它shell还有C shell、TC shell、Korn shell等等
内部命令与外部命令
内部命令(builtin)就是shell本身包含的一些命令,外部命令是指存放起来的一些二进制文件或者shell脚本
# 查看一个命令是内部还是外部命令
# 比如查看cd命令是什么命令
type cd
那就意味着,如果我们能够自行设计某个命令,要保证shell能够检索到
那么shell的搜索目录是什么呢?它存在一个shell变量中 PATH
# 查看PATH变量
echo $PATH
# 查看所有环境变量
set
env
得到的返回值可能是这样的
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/lu/gopath/bin
那就是说,shell搜索将会从以冒号为分割的这些目录中进行(shell的分隔符是:其它解释器可能会不一样)
如果你想了解几个常用的环境变量:https://www.51cto.com/article/743959.html
常用的几个启动文件
/etc/profile``~/.bash_profile``~/.bash_login ~/.bashrc | bash启动时自动生效,如果想编辑后立即生效,使用source [file]指令 |
---|---|
~/.bash_logout | bash退出时执行 |
~/.bash_history | 记录最近的命令 |
学习.bashrc相关知识:https://zhuanlan.zhihu.com/p/33546077
常用命令
这里不会单独展开了,可以参考下面这篇博客
Linux基础知识汇总,看这一篇就够了(2022最新整理)-腾讯云开发者社区-腾讯云 (tencent.com)
文本编辑器
常见的有vi
、vim
、nano
等,自行查阅相关资料即可
如果有志于linux深入学习,那么掌握至少一种编辑器是十分必要的
文件
类型
linux中一切皆文件,所有的操作都是基于文件的
Linux操作系统文件分为:普通文件、目录文件、字符设备文件、块设备文 件、符号链接文件、管道文件、socket文件
- 普通文件
这类文件的文件名最长不能超过255个字符,可以用除保留字符以外的任何字符给文件命名。尽量不要使用非打印字符、空白字符(空格和制表符)和shell 命令保留字符。另外,扩展名对LINUX系统来说没有任何意义,所以linux不会像windows那样根据文件名后缀判断文件的类型,但是为了便于阅读和管理的话,可以任意给文件名加上你自己或应用程序定义的扩展名 (e.g. .c file extension is required by C compilers)
- 目录文件
目录文件只允许系统修改,不允许用户进程修改,只允许用户读取
对于每个目录下,都有两个特殊的目录 '.'表示当前目录 '..'表示上级目录
- 设备文件
包括字符设备文件和块设备文件,linux把对IO设备的读取和写入作为对文件的读取和写入
linux内核提供了对设备处理和对文件处理的统一接口
字符设备文件和块设备文件的三点不同
1.字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等
2.块设备可以随机访问,但是字符设备不可以
3.字符和块没有访问量大小的限制,块也可以以字节为单位来访问
- 链接文件
分为软链接和硬链接文件,通常可类比与快捷方式,但是稍有不同
- 管道文件(FIFO)
用于进程间传递数据
- 套接字文件(Socket)
系统目录结构
- 根目录(/):根目录位于分层文件系统的最顶层,用斜线(/)表示。它包含一些标准文件和目录,因此可以说它包含了所有的目录和文件。
- /bin:也称二进制(binary)目录,包含了那些供系统管理员和普通用户使用的重要的Linux命令的可执行文件。一些常用的命令有:bash、cat、chmod、cp、date、echo、kill、ln、mail、 mkdir、more、mv、ps、pwd、rm、rmdir、sh、stty、su、tcsh、uname和vi。一些用于系统 恢复的命令如:tar、gzip、gunzip和zcat。还有一些网络命令如:domainname、hostname、 netstat和ping。目录/usr/bin下存放了大部分的用户命令。
- /boot :在这个目录下存放系统启动时要用到的程序。包括Linux内核的二进制映像。内核文件 名是vmlinux加上版本和发布信息。
- /dev:dev 是设备(device)的英文缩写。在这个目录中包含了所有linux系统中使用的外部设 备。但是这里并不是放的外部设备的驱动程序。
- /etc :etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的 各种配置文件和子目录。我们要用到的网络配置文件,文件系统,x系统配置文件,设备配置信 息,设置用户信息等都在这个目录下。
- /sbin :这个目录是用来存放系统管理员的系统管理程序。 /sbin,/usr/sbin,/usr/root/sbin:存放了系统管理的工具、应用软件和通用的root用户 权限的命令。
- /home :存放用户的主目录。如果建立一个用户,用户名是“ji”,那么在/home目录下就有一个 对应的/home/ji路径,用来存放用户的主目录。
- /lib :lib是库(library)英文缩写。这个目录是用来存放系统动态连接共享库的。几乎所有的应 用程序都会用到这个目录下的共享库。 /media 媒体目录,可移动媒体设备的常用挂载点
- /mnt :这个目录主要用来临时装载文件系统,系统管理员运行mount命令完成装载工作。 /opt:该目录用来安附加软件包
- /proc :目录存放了进程和系统得信息,可以在这个目录下获取系统信息。这些信息是在内存中, 由系统自己产生的。
- /root :根(root)用户的主目录。如果用户是以超级用户的身份登录的,这个就是超级用户的 主目录。
(转载自jjm 教授《Linux程序设计》课程的ppt)
- /tmp :用来存放不同程序执行时产生的临时文件。
- /usr :是linux文件系统中最大的目录之一。它存放了可以在不同主机间共享的只读数据。
- /lost+found : 目录中存放所有和其他目录没有关联的的文件,这些文件可以用Linux工具 fsck查找得到。
- /var : 用来存放易变的数据,这些数据在系统运行过程中会不断变化。 /var/spool/mail 存放收到的电子邮件,/var/log 存放系统的日志, /var/ftp 。
有几个特殊的保留字符:
- 用户主目录:~
- 当前目录 . 上级目录 ..
绝对路径是从根目录算起的路径,而相对路径是从当前工作目录算起的路径
文件系统
建议阅读这两篇自行学习
https://zhuanlan.zhihu.com/p/44267768
https://zhuanlan.zhihu.com/p/505338841
文件安全与共享
保护机制
Linux提供的三层次文件保护机制:
\1. 使用 登录名(login name)和登录密码(password) ——超级管理员给注册账户密码
\2. 文件加密——用软件加密
\3. 文件访问特权(File access privileges)——策略有用户分类,访问权限分类和文件操作权限
文件访问特权
用户分类
每个用户属于一个组,系统中所有组的信息可以查看/etc/group
对于一个单文件来说,有三种类型的用户,owner users、group users、others
root为超级用户,可以任意访问所有文件
文件操作分类
读、写和执行三种操作
我们可以通过观察ls -l
命令,看到一个文件各类用户具备的权限,如果不具备权限,则不允许操作
chmod命令可以更改一个文件的操作权限
chmod学习:https://www.runoob.com/linux/linux-comm-chmod.html
umask命令可以更改新创建一个文件时的权限,自行检索学习
符号链接
主要有两种,软链接和硬链接,学习请参考:
https://www.jianshu.com/p/dde6a01c4094
https://www.zhihu.com/tardis/zm/art/619264530?source_id=1005
进程、重定向与管道
进程
当linux执行一个外部命令时,就会启动一个新的进程,然后执行结束后关闭这个进程
思考:什么是外部命令?什么是内部命令
——请自行检索学习
查看进程的指令 :ps
(指令参数具体含义及用法请自行查阅)
如果我们想要把一个命令通过后台执行,那就在一行命令最后加上&即可
产生的效果是,这条命令会在background执行,而非frontend
思考:我们想要对一个已经开始执行的命令进行切换, 该怎么实现呢?比如从前台转为后台
答案:首先ctrl+z挂起一个前台进程,然后这个进程暂停执行,
fg
和bg
分别为把最近挂起的进程进行前台和后台执行,如果想指定一个任务,那么在fg或bg后加上job number
jobs
命令可以看所有当前被挂起和执行的命令
通常我们执行命令是一条一条来执行的,也就是说顺序执行
那么如果我们想要并发执行,就需要用下面这个格式
格式:命令1&命令2&…命令N&
如果我们想要终止一个进程,该怎么做呢?
对于前台进程:ctrl+C
对于后台进程:kill命令(使用方法自行检索)
接下来我们讨论linux的进程之间关系如何?下面这张图是linux进程树
pstree命令可以用图的形式显示当前系统中执行进程的进程树,勾勒出进程间的父子关系。
如果方便显示,可以配合more指令使用
pstree –a | more
重定向
linux的三种类型的标准流
Standard Input (stdin) 标准输入
Standard Output (stdout) 标准输出
Standard Error (stderr) 标准错误
默认情况下,stdin来自于键盘,stdout和stderr是导出到屏幕上显示
输入重定向
如果我们要重定向stdin使用<,比如cat < myFile,还有一种重定向是内联输入重定向,要求有一个标记来区分输入数据的开始和结尾,所以我们可以这样用
wc << EOF
> hello
> wolrd
> EOF
输出重定向
使用>,作用是重新创建or覆盖原文件,把指令的输出写入这个文件中
如果我们想要实现追加的功能,使用>>符号
输入输出流的合并
如果我们使用这样一条命令:
cat < file1 > file2
那么它的执行流程是怎么样的呢?
输入时使用file1,输出到file2
错误重定向
由于错误重定向也要输出到某个文件中,因此我们也需要用>这个符号
那我们应该怎么区分呢?
在linux中,其实对于这三种重定向都有独特文件描述符
standard input (sdin) — 0
standard output (stout) — 1
standard error (sderr) — 2
所以我们要重定向标准输入和输出,就可以写成 cat 0< file1 1> file2
当然,如果你不存在重定向错误流,忽略掉这个描述符是可行的,但是只要使用标准错误流重定向,那就必须加上这个文件描述符。比如ls –l foo 2> error.log
这个命令的作用是以长格式(-l)查看foo这个文件的信息,如果出错了,重定向到这个error.log
不过注意一个细节,这个error.log,不论是否发生错误都会被创建
如果我们就想要输出和错误都输出到一个文件里怎么办?
cat lab1 lab2 lab3 1> cat.output.errors 2>&1
cat lab1 lab2 lab3 2> cat.output.errors 1>&2&1是说明,标准错误流复制文件描述符为1的标准输出流
&2是说明,标准输出流复制文件描述符为2的标准错误流
思考:
cat lab1 lab2 lab3 2>&1 1> cat.output.errors
这个命令的含义是什么?在命令行的解析中,文件的重定向顺序是从左到右
标准出错先设置成标准输出的拷贝,但是这个时候&1指的标准输出还是显示器,所以错误会打在屏幕上,然后标准输出才改为cat.output.errors,标准输出就输出到这个文件中了。
example:
如果要不覆盖内容的重定向输出和错误,可以用>>
exec命令
通常exec用来执行新的命令以替换当前的shell进程,而不是生成一个新的进程
执行结束后返回父进程,因此通常当前这一级的shell会关闭
exec命令与重定向
Bash shell最多允许同时使用10个文件描述符。其中三个是保留的,标准输入 (0),标准输出(1),标准错误(2)。 用exec命令及重定向操作符可以用这10个描述符进行文件I/O。
当从命令行运行时,exec < sample命令将sample文件中的每一行作为命令, 由当前shell执行。
当从命令行执行exec > data 命令时,将使此shell后面的所有命令输出到文件 data中(通常是输出到显示屏)。
管道
Linux允许一条命令的标准输出成为另外一条命令的标准输入
用管道连接的那些命令叫做过滤器(filter)。一个过滤器(Filters)是一组Linux的命令, 从标准输入经过处理送到标准输出。
一些经常用到的过滤器是:cat、compress、crypt、grep、gzip、lp、pr、sort、 tr、uniq和wc。
tee命令
语法:
tee [options] file-list
用途:从标准输入中得到输入然后送到标准输出和file-list中
command1| tee file1…fileN|command2
command1标准输出作为tee的标准输入, tee
输出送到文件 file1到fileN中,同时作为command2的标准输入
Bash编程
https://www.runoob.com/linux/linux-shell.html
Linux编程
C/C++为例,可以使用vi vim gedit等工具来编写代码,然后使用gcc g++这类的软件来编译运行
另外,如果我们想要调用一些系统资源,我们可以使用系统调用(一个独立话题,值得学习)
如果想要深入了解,可以自行设计一个shell出来,这里粘贴一个我实现的demo,欢迎大家来共同开发
github仓库为Crer-lu/miniShell: realize a shell of linux (github.com)
声明
Author:Crer_lu
如果您想使用相关内容,请联系作者email : lu@zjuxlab.com