Linux应知应会

首先我们所说的学Lixux并不是学“Linux”,那个和内核相关境界达不到,所以说白了我们就是在体验。你真正应该学习的对后续不管就业还是科研有用的就是shell,那么从shell开始也不符合认知,所以先认识Linux。

Linux初识

Linux是操作系统分为四部分:
1.Linux kernel
2.GNU tools(GNU 本质上是一个旨在打造完全自由软件的操作系统项目)
3.GUI desktop
4.Application
图1
因为某些原因吧GNU(genu)没有创建出自己的操作系统,但是GNU开发的工具(比如我们熟知的GCC编译器)和林纳斯开发的内核刚好就组成了操作系统,所以全名应该叫GNU/Linux更合适。
然后大概说下文件系统,文件系统说白了就是提供了读写标准,比如我们都直到windows是NTFS,Linux目前应该是ext4可以自行搜索了解一下,然后你可以用df -T看一下分区这个后面再说可以看到Type列不只有ext4还有其他的不像windows都是NTFS那么统一。
然后大概说下shell,shell提供给用户使用的软件,用户用他使用电脑进行交互,其实分两类CLI(Command-Line Interface命令行界面)和GUI,但是我们一般就直接指CLI了,所以学好shell!

常见命令

推荐好用的第三方软件https://github.com/nvbn/thefuck
tab和上下键,没必要练习打字
英语不好参考https://wangchujiang.com/linux-command/
复制crtl+shift+c
小技巧 ctrl+方向键可以跳,这就是为啥命名喜欢用_
ctrl a(ahead) 跳到开头 ctrl e (end) 跳到结尾
ctrl u 把光标前(不包含)全删了
ctrl k 把光标(包含)后全删了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ls -a 显示隐藏文件
用户名@计算机名(因为允许一个中端多用户操作方便区分)
~ 用户home目录
ll
man ls 自己学(pg up pg dn翻页 q退出)
clear
cd /
cd ..
cd - (快速切换回上一次所在的目录)
cd !$ (切换到上一条命令中最后一个参数所表示的目录)
touch 1.txt (用于创建空文件或修改文件的时间戳)
mkdir test
vim 1.txt
gedit 1.txt
cp 你想复制的文件 你想复制到哪里
cp 源文件 目标文件(建议使用cp -i 手动确定是否覆盖文件 y n)
cp -r src dest (recursive,将src目录及其所有内容复制到dest目录中,其实不懒省事建议加上/明确表示目录,但是我懒)
cp -r src/* dest/ (只想复制src目录内的内容(不含src本身到dest)
cp ../src/* . (建议熟练能使用.)
rm
sudo rm -rf /*
rm -i (推荐)
mv (move or rename files)
mv org.txt rename.txt
mv 1.java ~/Documents/JAVA/
cat 1.txt
less app.log (查看文件内容,上下箭头 enter pg up dn,/查找,enter退出查找,q退出less)
tail/head -n 2 1.txt
df -h (查看磁盘分区使用情况)
du -h (看下当前目录哪个文件站的空间大,xs)
sort -Mr time.log
du -sh * | sort -nr (快速定位当前目录下占用磁盘空间较大的文件或目录的组合命令)

Linux目录

https://www.pathname.com/fhs/
fhs Filesystem Hierarchy Standard(文件系统层次结构标准)
Linux一切皆文件(没有盘符什么乱七八糟的)
/ 根目录(Windows\Linux/)
/bin 二进制目录 GNU工具(ls其实就是文件)
/cdrom 光盘
/etc 系统文件配置目录
/home 显示所有用户目录
/lib 放的是以来的库文件
/mnt 挂载(外在设备和电脑进行连接(U盘))目录
/run 运行目录
/tmp 临时文件
/var 可变目录(log)
/boot 启动目录
/dev 设备目录
/opt 可选目录(存放第三方软件)
/root 管理员(sudo rm -rf/*)根本用不上没企业给你这个
/srv 服务目录 本地服务
/usr 看成软件资源库

Linux路径

绝对路径相对路径都知道就不说了
但是一定要注意

1
2
3
4
cd /Doc/1.txt 根目录下 
~ cd Doc/1.txt /home/zqc/Doc/1.txt绝对路径
./ 建议
../ 父目录

快捷方式(.lnk)

Linux 叫链接文件
1.软连接(符号链接) (快捷方式)原来的文件/文件夹必须存在
2.硬链接 副本 原来的文件/文件夹必须存在(和windows不一样)
图3
图2

任务管理器

1
2
3
4
5
top
ps (man一下几千行不可能全掌握)
ps -f (查看进程状态 full format)
ps -aux | grep named # 查看named进程详细信息
kill PID

挂载

大致理解一下就是比如你插U盘显示H盘,那么这个盘是虚拟的不是你电脑上本身存在的。

1
2
3
sudo fdisk -l (查看磁盘分区表信息)
mount /dev/hda1 /mnt (将/dev/hda1挂在/mnt之下)
df -h (可以查看分区挂载点)

压缩与解压

tar 打包 Linux只能压缩一个文件 所以看见很多文件都是先打包再压缩的,.tar.gz

1
2
3
tar -zcvf /tmp/bin-backup.tar.gz /home/vivek/bin/(将 /home/vivek/bin/ 目录打包,并使用 gzip 算法压缩。保存为 /tmp/bin-backup.tar.gz 文件)
tar -zxvf /opt/soft/test/log.tar.gz (解压)
tar -zxvf /opt/soft/test/test/log.tar.gz & (挂后台解压)

父子shell

Bash 是 Bourne Again Shell 的缩写,是 Linux 和 macOS 系统中默认的命令行解释器,核心作用是接收用户输入的命令并传递给操作系统执行。所以你可以理解成bash是shell的一种实现。
图4
可以看下PPID和PID关系
图5
bash 族谱

环境变量

比如notepad.exe在C:\Windows\System32这个路径下面,那为什么我们在任意地方或者说盘都可以打开notepad呢?因为C:\Windows\System32这个已经存储到了系统环境变量中,所以环境变量的作用就可以理解为提前打招呼进行预约。
我们可以发现有系统变量和用户变量,系统变量就比如你电脑上用户1注销了或者切换成用户2,但是系统变量还是能使用。
在Linux中就叫全局变量和局部变量
printenv可以类别系统(全局变量)

1
2
3
4
export ZQC = "zqc" 
echo $ZQC
zqc
unset ZQC

父子shell可以用,但是你×掉后就没了
set看局部变量没什么用
1
2
3
4
zqc = "zqc" 必须小写,要不被误解成全局变量单词之间用_隔开
echo $zqc
zqc
unset zqc

但是你再开一个shell就没了
永久配置
1
2
3
4
vim ~/.bashrc
export MY_VARIABLE=my_value
export PATH=$PATH:/home/user/my_new_path
source ~/.bashrc

Vim

i(insert) esc :wq
只知道这些就体会不到vim的妙处了
H左
L右
J下
K上
你会发现这个就是标准指法四个指头的键位,节省时间
pg up / ctrl f 向上翻页
pg dn / ctrl b 向下翻页
ctrl e 向下滚动
ctrl y 向上滚动
G 跳到最后一行
gg 跳到第一行
:q!不保存修改直接退出
i 光标位置前面插入
a 光标位置后面插入
o 直接到下一行输入
x 删除光标所在字符
dd 删除行
u 撤销
dw 移除当前光标往后的单词
v进入可视化模式移动HJKL,y复制选中内容
p粘贴 d删除
gg v G全选
/hello查找 n下一个 N上一个

1
2
3
4
:3,5s/hello/world/g → 替换第 3-5 行中所有 “hello” 为 “world”(:set number显示行号)
:s/old/new/ 当前行是 “old old old”,执行后变为 “new old old”
:s/old/new/g 当前行 “old old old” → 变为 “new new new”
:%s/old/new/g 把所有的都换了

结语

其实还有很多没写,尤其是tmux和docker,也许之后会补上,tmux在深度学习训练的时候必不可少尤其是长周期训练,docker不会可以脱脱睡了,当然你要真想开源后恶心别人我也没意见。