之前用的是插件直接在markdown内写相对路径,然后整个将图片文件夹上传到仓库,后来发现在别的网站上发布的时候图片相对路径真是愁死人(不要在意为什么还要在别的网站发hhhh),于是还是使用了比较流行的Typora+PicGo+Gitee一套写文档懒狗必备的插入图片自动上传的方法。

阅读全文 »

Linux 学习(1)

一、基础知识

Terminal

终端termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux操作系统下使用组合键ctrl + alt + T打开的就是终端,可以认为terminaltty是同义词。

shell

shell是一种人机交互接口,是一个壳,负责外界与Linux内核的交互。

shell的操作如下:

echo $PATH 输出环境变量内的所有地址

%PATH= 用来添加环境变量的地址

Console

命令是操作系统最常用操作

命令也有自己的语法结构:

和人说话一样,命令的主要结构也可以看做为主谓宾的简单句和复杂句,在命令中,省略主语

举个例子

1
cp(谓语动词)  fileA(宾语)  fileB(宾语)
1
cp(谓语动词)  -ar(方式状语)  fileA(宾语)  fileB(宾语)

一般情况下-后面加选项的缩写,--后面加选项的全程。

命令细节

Linux命令由以下几个部分组成:命令名分隔符选项操作对象组成。

命令名

命令名标识了命令的功能,如cp,rm,mv,rename,fdisk等等,都能很轻易的看出该命令的功能,还有一些命令,有二级子命令,如apt-get install | remove,install和remove就是apt-get的子命令。

分隔符

分隔符通常为空格,连续的多个空格会被视为一个空格。

一些特殊的符号也属于分隔符,例如管道|,重定向>,<<,<,>>,后台运行&,序列执行&&;都是特殊的分隔符,在使用这些特殊符号的时候,不需要额外加空格,但为了使命令更易读,通常会加上空格。

选项
  • 命令的选项通常用-连接,通常为一个字母,是选项的首字母。大多数命令都可以使用-h来查看该命令的帮助。
  • 命令的选项也可以使用--来引导,接的是选项的全程,效果与—连接单个字母是一样的。
操作对象

操作对象为该命令动作的承受着。

格式约定

  • 使用[]来标记可以选择的选项
  • 使用|来表示不能同时使用的参数
  • 选项通常紧跟命令名,当然,在很多时候我们可以省略命令的选项而使用默认参数

二、程序与进程

我们执行命令的时候,每一个命令,其实对应的就是系统中的一个程序。 下图使用which命令查找cp命令的位置,并使用llfile命令查看cp命令的具体信息:

通过llfile命令可以看出文件cp是一个可执行的二进制文件,也就是我们平时所说的程序。

那么什么是程序呢?

计算机程序是指一组指示计算机执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。

什么又是进程呢?

进程是程序在内存中的镜像。

三、路径

绝对路径

绝对路径的起始点为根目录 / ,eg:/user/bin/cp

相对路径

相对路径的起始点为当前路径. ,eg:./a.out

远程路径

用来访问本机以外的资源

协议://用户名:密码@位置/路径/:端口

https://baidu.com

特殊路径符号

~ cd ~ 返回家目录 ~username返回用户的家目录

- cd -回到上次访问的目录

四、软件

在Linux中,软件并没有像注册表这样的概念。

注册表:是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。

安装软件。理论上只需要拷贝相关文件,并执行其主程序就可以。

通常,一个软件包含的内容会分别被拷贝到同级别的bin lib share/etc目录下。

bin 存放程序的可执行文件。在系统环境变量中将该路径添加进去,就可以直接执行程序.

lib 库文件集中存放,方便共享。

share 存放程序需要的其他资源.

/etc 配置文件存放路径,大部分的程序的配置文件都可以在这个路径下找到。

五、配置方式

image-20200919153828744

六、隐藏文件

所有以.开头的文件都为隐藏文件,使用ls -a就可以显示隐藏文件。

七、文件类型

使用ll命令可以查看当前文件夹下所有文件的详细信息。

ll 等效于 ls -al

1
2
3
4
5
6
7
8
9
10
11
12
13
14
suyelu@HaiZei-Tech:~$ ll
total 52
drwxr-xr-x 5 suyelu suyelu 4096 Apr 27 11:40 ./
drwxr-xr-x 3 root root 4096 Apr 23 13:40 ../
-rw------- 1 suyelu suyelu 2064 Apr 27 11:49 .bash_history
-rw-r--r-- 1 suyelu suyelu 220 Apr 23 13:40 .bash_logout
-rw-r--r-- 1 suyelu suyelu 3486 Apr 23 13:40 .bashrc
drwx------ 2 suyelu suyelu 4096 Apr 23 17:25 .cache/
drwxrwxr-x 3 suyelu suyelu 4096 Apr 23 18:07 code/
-rw-r--r-- 1 suyelu suyelu 4096 Apr 23 18:06 ._.DS_Store
-rw-r--r-- 1 suyelu suyelu 6148 Apr 23 18:43 .DS_Store
-rw-r--r-- 1 suyelu suyelu 675 Apr 23 13:40 .profile
drwxrwxr-x 2 suyelu suyelu 4096 Apr 26 21:32 .ssh/
-rw------- 1 suyelu suyelu 1876 Apr 27 11:40 .viminfo

该命令主要输出了七列内容,分别为:权限、文件数、所属用户、所属群组、文件大小、常见日期、文件名。

第一列权限,主要可以分为以下四个部分:文件类型,所属用户权限,所属组权限,其他用户权限。

以刚才执行ll的结果中的../目录的权限为例:

文件类型 所属用户权限 所属群组权限 其他用户权限
d rwx r-x r-x
  • 第一部分文件类型为d,代表这个文件是一个目录(directory),目录是一种特殊的文件;
  • 第二部分所属用户权限为rwx,代表该文件拥有者拥有可读(read),可写(write),可执行(execute)的权限;
  • 第三部分所属群组权限为r-x,代表与该文件拥有者在一个群组的用户具有可读,可执行的权限,在这里-顶替了w的位置,代表没有写权限;
  • 第四部分其他用户权限同样为可读,可执行。

需要注意的是rwx的顺序是固定的!

Linux中的文件类型除了目录d之外,总共有7种文件类型,在这里我们做一个简要的了解:

  • - regular file 普通文件
  • d directory 目录
  • l link 链接
  • b block 块设备 存储数据以供系统存取的接口设备,也就是硬盘 (缓冲机制)
  • c character 字符设备 串口设备,键盘,鼠标等
  • s socket套接字
  • p pipe 管道

对于普通文件又可以分为以下三种:

  • 纯文本文件

纯文本文件使用ASCII编码,这是Linux系统中最常见的一种文件类型,之所以成为纯文本文件,是因为这种类型的文件是我们可以直接读取的内容,在Linux,几乎所有的配置文件都属于这种类型。

  • 二进制文件

二进制文件是系统中的可执行文件(不包括脚本),计算机只能认识并执行二进制文件。二进制文件不能使用cat等命令直接读出。

  • 数据格式的文件

在一些程序运行过程中,需要读取特定格式的文件,这种文件被称为数据文件(data file)。这种文件通常也不能使用cat命令读出。
例如:/var/log/wtmp文件。

使用ll命令查看文件,可以看到该文件为普通文件

1
2
3
>suyelu@HaiZei-Tech:~$ ll /var/log/wtmp
>-rw-rw-r-- 1 root utmp 8832 Apr 27 11:50 /var/log/wtmp
>

使用file命令查看问价详情,返回为data

1
2
3
>suyelu@HaiZei-Tech:~$ file /var/log/wtmp
>/var/log/wtmp: data
>

使用cat命令读取该文件为乱码,但是使用last命令则可以读取该文件中的内容。

八、文件权限

在上节我们已经提到了文件的权限包含三组(u用户,g群组,o其他用户),每一组又都包含三组具体的权限(r读,w写,x执行)。

对于文件权限,我们也可以用下面的方式来表示:

r w x r w x r w x
(2^2)4 (2^1)2 (2^0)1 (2^2)4 (2^1)2 (2^0)1 (2^2)4 (2^1)2 (2^0)1

也就是权限的每一组都由三个十进制的数字表示,该组的的权限就可以简单的用着三个十进制的数字相加得到。

一个权限为rwxr-xr-x的文件,则它的权限可以使用755来表示。

九、用户

使用su命令来切换用户 eg:su - root

  • 超级管理员:root

  • 普通用户

  • 拥有权限的普通用户

十、bash

通配符

  • ***** 任意数量的任意字符
  • 单个任意字符

除了***和?**这两个通配符之外,Linux中还有下面几种通配符

通配符 含义 举例
[list] 匹配list中的任意单一字符 a[xyz]b a与b之间有且只有一个字符, 且只能是x或y或z, 如: axb, ayb, azb。
[!list] 匹配除list中的任意单一字符 a[!0-9]b a与b之间有且只有一个字符, 但不能是数字, 如axb, aab, a-b等
[c1-c2] 匹配c1-c2中的任意单一字符 a[0-9]b a与b之间有且只有一个字符,该字符是0-9之间的数字,如a0b, a1b,… ,a9b。
{string1,string2,…} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。

任务管理

  1. &

    在命令的后面加上&表示后台执行的意思

    1
    command &
  2. ;

    在命令之间以;相连,表示顺序执行的意思

    1
    command1;command2
  3. &&

    命令之间以&&相连时,只有第一个命令成功执行,第二个命令才会执行

    1
    command1 && command2
  4. ||

    命令之间以||相连时,如果前一个命令执行失败,则执行第二个命令

    1
    command1 || command2
  5. ``

    命令中如果包含另一个命令,则用符号`` 将它包括起来,在执行的时候系统将优先执行``中的子命令,然后将其结果代入父命令继续执行

    1
    command1 `command2`
  6. ctrl + z

    在shell中执行命令时,同时按下ctrl + z可以将暂时挂起

    1
    2
    3
    4
    suyelu@HaiZei-Tech:~$ vim helloworld.c

    [1]+ Stopped vim helloworld.c
    suyelu@HaiZei-Tech:~$

    什么是挂起?

  1. bg

    执行bg命令,可以将挂起的命令后台运行

    1
    2
    3
    4
    5
    6
    7
    suyelu@HaiZei-Tech:~$ vim helloworld.c


    [1]+ Stopped vim helloworld.c
    suyelu@HaiZei-Tech:~$ bg
    [1]+ vim helloworld.c &
    suyelu@HaiZei-Tech:~$
  2. fg

    执行命令fg可以将后台执行的命令转为前台执行

  3. jobs

    在Linux系统中,执行jobs命令可以查看所有在后台执行和挂起的任务以及任务编号

    1
    2
    3
    4
    suyelu@HaiZei-Tech:~/code$ jobs
    [1]- Stopped vim a.c (wd: ~)
    [2]+ Stopped vim b.c (wd: ~)
    [3] Running ./a.out &

尝试执行fgbg加上任务编号,看看是什么效果

管道、重定向

  1. >

    重定向符

  2. >>

    作用于>基本相同,不同的是>>将内容追加到文件的末尾,而>内容覆盖原文件

  3. <

    >刚好相反,是从文件到命令的重定向。它将文件的内容输出到命令作为输入

  4. <<

    ?

    1
    2
    3
    cat >> /etc/sysconfig/network << EOF
    HOSTNAME=$HOST_NAME
    EOF

转义符

Linux中转义符\的应用十分广泛,除此之外,转义符还包括“”‘’

字符 说明
‘’ 硬转义,硬引用,其内部所有的shell元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
“” 软转义,软引用,其内部只允许出现特定的shell元字符($,`,\):$用于变量值替换、`用于命令替换、\用于转义单个字符
\ 反斜杠,转义,去除其后紧跟的元字符或通配符的特殊意义。

下表是部分转义字符对应表:

转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜线字符’’' 092
' 代表一个单引号(撇号)字符 039
" 代表一个双引号字符 034
? 代表一个问号 063
\0 空字符(NULL) 000
\nnn 1到3位八进制数所代表的任意字符 三位八进制
\xnnn 1到3位十六进制所代表的任意字符 三位十六进制

转义符在Shell中的应用

1
2
3
4
5
6
7
8
suyelu@HaiZei-Tech:~$ echo -e "\044"
$
suyelu@HaiZei-Tech:~$ echo "\044"
\044
suyelu@HaiZei-Tech:~$ echo $'\044'
$
suyelu@HaiZei-Tech:~$ echo $'\44'
$

附录1 Shell元字符

字符 说明
= 变量名=值,为变量赋值。注意=左右紧跟变量名和值,中间不要有空格
`` 取命令的执行结果,与下文的$有相似之处
$ 变量值替换,$变量名替换为shell变量的值;为避免在文本连接时混淆,请使用${变量名};$0…$9 代表shell文件的参数。$()同``;${}限定变量名的范围;$[]整数计算;
> prog > file 将标准输出重定向到文件。
>> prog >> file 将标准输出追加到文件。
< prog < file 从文件file中获取标准输入
<<
| 管道命令,例:p1 | p2 将p1的标准输出作为p2的标准输入
& 后台运行命令,最大好处是无需等待命令执行结束,就可以在同一命令行下继续输入命令
() 在子shell中执行命令,在子进程中执行
{} 在当前shell中执行命令,或用在变量替换的界定范围(例如上面的${变量名}用法)。
[] 字符通配,匹配括号内之一
; 命令结束符。例如p1;p2表示先执行p1,再执行p2
&& 前一个命令执行成功后,才继续执行下一个命令。例:p1 && p2 ;若p1执行成功后,才执行p2,反之,不执行p2;
|| 前一个命令执行失败后,才继续执行下一个命令。例:p1 || p2 ;若p1执行成功后,不执行p2,反之,才执行p2;
! 执行历史记录中的命令!731;匹配最近的一次命令!echo;取非ls /dev/sda[!1];结果取反! echo ok ;echo $?
% % 1相当于fg 1
^ 取非,和!雷同;^string1^string2^将上一命令的string1替换为string2
~ home目录
# 注释
* 通配符,任意字符
? 通配符,任一字符
. 当前目录;source
- 减号;上次工作目录
: 真值;空命令
\ 转义
/ 目录分割符

附录2 ASCII码 对照表

Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释
0000 0000 0 0 00 NUL(null) 空字符
0000 0001 1 1 01 SOH(start of headline) 标题开始
0000 0010 2 2 02 STX (start of text) 正文开始
0000 0011 3 3 03 ETX (end of text) 正文结束
0000 0100 4 4 04 EOT (end of transmission) 传输结束
0000 0101 5 5 05 ENQ (enquiry) 请求
0000 0110 6 6 06 ACK (acknowledge) 收到通知
0000 0111 7 7 07 BEL (bell) 响铃
0000 1000 10 8 08 BS (backspace) 退格
0000 1001 11 9 09 HT (horizontal tab) 水平制表符
0000 1010 12 10 0A LF (NL line feed, new line) 换行键
0000 1011 13 11 0B VT (vertical tab) 垂直制表符
0000 1100 14 12 0C FF (NP form feed, new page) 换页键
0000 1101 15 13 0D CR (carriage return) 回车键
0000 1110 16 14 0E SO (shift out) 不用切换
0000 1111 17 15 0F SI (shift in) 启用切换
0001 0000 20 16 10 DLE (data link escape) 数据链路转义
0001 0001 21 17 11 DC1 (device control 1) 设备控制1
0001 0010 22 18 12 DC2 (device control 2) 设备控制2
0001 0011 23 19 13 DC3 (device control 3) 设备控制3
0001 0100 24 20 14 DC4 (device control 4) 设备控制4
0001 0101 25 21 15 NAK (negative acknowledge) 拒绝接收
0001 0110 26 22 16 SYN (synchronous idle) 同步空闲
0001 0111 27 23 17 ETB (end of trans. block) 结束传输块
0001 1000 30 24 18 CAN (cancel) 取消
0001 1001 31 25 19 EM (end of medium) 媒介结束
0001 1010 32 26 1A SUB (substitute) 代替
0001 1011 33 27 1B ESC (escape) 换码(溢出)
0001 1100 34 28 1C FS (file separator) 文件分隔符
0001 1101 35 29 1D GS (group separator) 分组符
0001 1110 36 30 1E RS (record separator) 记录分隔符
0001 1111 37 31 1F US (unit separator) 单元分隔符
0010 0000 40 32 20 (space) 空格
0010 0001 41 33 21 ! 叹号
0010 0010 42 34 22 双引号
0010 0011 43 35 23 # 井号
0010 0100 44 36 24 $ 美元符
0010 0101 45 37 25 % 百分号
0010 0110 46 38 26 & 和号
0010 0111 47 39 27 闭单引号
0010 1000 50 40 28 ( 开括号
0010 1001 51 41 29 ) 闭括号
0010 1010 52 42 2A * 星号
0010 1011 53 43 2B + 加号
0010 1100 54 44 2C , 逗号
0010 1101 55 45 2D - 减号/破折号
0010 1110 56 46 2E . 句号
00101111 57 47 2F / 斜杠
00110000 60 48 30 0 数字0
00110001 61 49 31 1 数字1
00110010 62 50 32 2 数字2
00110011 63 51 33 3 数字3
00110100 64 52 34 4 数字4
00110101 65 53 35 5 数字5
00110110 66 54 36 6 数字6
00110111 67 55 37 7 数字7
00111000 70 56 38 8 数字8
00111001 71 57 39 9 数字9
00111010 72 58 3A : 冒号
00111011 73 59 3B ; 分号
00111100 74 60 3C < 小于
00111101 75 61 3D = 等号
00111110 76 62 3E > 大于
00111111 77 63 3F ? 问号
01000000 100 64 40 @ 电子邮件符号
01000001 101 65 41 A 大写字母A
01000010 102 66 42 B 大写字母B
01000011 103 67 43 C 大写字母C
01000100 104 68 44 D 大写字母D
01000101 105 69 45 E 大写字母E
01000110 106 70 46 F 大写字母F
01000111 107 71 47 G 大写字母G
01001000 110 72 48 H 大写字母H
01001001 111 73 49 I 大写字母I
01001010 112 74 4A J 大写字母J
01001011 113 75 4B K 大写字母K
01001100 114 76 4C L 大写字母L
01001101 115 77 4D M 大写字母M
01001110 116 78 4E N 大写字母N
01001111 117 79 4F O 大写字母O
01010000 120 80 50 P 大写字母P
01010001 121 81 51 Q 大写字母Q
01010010 122 82 52 R 大写字母R
01010011 123 83 53 S 大写字母S
01010100 124 84 54 T 大写字母T
01010101 125 85 55 U 大写字母U
01010110 126 86 56 V 大写字母V
01010111 127 87 57 W 大写字母W
01011000 130 88 58 X 大写字母X
01011001 131 89 59 Y 大写字母Y
01011010 132 90 5A Z 大写字母Z
01011011 133 91 5B [ 开方括号
01011100 134 92 5C \ 反斜杠
01011101 135 93 5D ] 闭方括号
01011110 136 94 5E ^ 脱字符
01011111 137 95 5F _ 下划线
01100000 140 96 60 ` 开单引号
01100001 141 97 61 a 小写字母a
01100010 142 98 62 b 小写字母b
01100011 143 99 63 c 小写字母c
01100100 144 100 64 d 小写字母d
01100101 145 101 65 e 小写字母e
01100110 146 102 66 f 小写字母f
01100111 147 103 67 g 小写字母g
01101000 150 104 68 h 小写字母h
01101001 151 105 69 i 小写字母i
01101010 152 106 6A j 小写字母j
01101011 153 107 6B k 小写字母k
01101100 154 108 6C l 小写字母l
01101101 155 109 6D m 小写字母m
01101110 156 110 6E n 小写字母n
01101111 157 111 6F o 小写字母o
01110000 160 112 70 p 小写字母p
01110001 161 113 71 q 小写字母q
01110010 162 114 72 r 小写字母r
01110011 163 115 73 s 小写字母s
01110100 164 116 74 t 小写字母t
01110101 165 117 75 u 小写字母u
01110110 166 118 76 v 小写字母v
01110111 167 119 77 w 小写字母w
01111000 170 120 78 x 小写字母x
01111001 171 121 79 y 小写字母y
01111010 172 122 7A z 小写字母z
01111011 173 123 7B { 开花括号
01111100 174 124 7C | 垂线
01111101 175 125 7D } 闭花括号
01111110 176 126 7E ~ 波浪号
01111111 177 127 7F DEL (delete) 删除

   fstream类是C++编译系统提供的以数据文件为对象的输入输出操作的类库,亦称文件I/O类,fstream类是标准I/O类iostream的派生类。以后查阅用。

阅读全文 »

  三道算法的实现,分别是字符串内所有数字之和、多项式简单卷积实现、怪物牛的生长数量。

阅读全文 »

  假期在家想好好看看PRML《模式识别与机器学习》这本书,看到github上有python的源码,又因为家里的电脑不想安装python了。突然想到收藏夹里还有colab这个东西,就打算在这上面运行运行试试。

阅读全文 »

  假期闲着在家自我隔离,于是想着学习下下围棋,万一以后有孩子了,也有一两手技术可以交给他,不能从小就带着打游戏吧。哈哈哈扯远了,下面是我学习后并总结的入门知识。

阅读全文 »

  在hexo搭建完成后,使用next主题,发现有些字体过大,比如标题下面提示文章发表时间、分类、标签等字体。以下提出我的修改方式(版本hexo:3.9.0、next:7.4.1)。

阅读全文 »