命令行笔记

Linux笔记

1656990922392

1656990978018

命令

  • ls 打印当前目录的列表

    1. ls -la -l让当前目录的文件呈列表显示,a列出所有文件,包括隐藏文件
    2. ls -lh 列出文件和目录,并显示大小(human-readable)
  • cat 文件名 查看文件内容?:连接文件并打印到标准输出设备上

  • tee 文件名 追加内容

  • <> 重定向:tee < a > b 把a写到b中

  • cd 目录 进入该目录

    1. cd .. 进入当前目录的上一级目录
  • pwd 输出当前路径

  • echo 字符串输出

  • mkdir 创建目录

  • mv 重命名或移动文件

  • cp 拷贝文件

  • man 命令 查看操作手册

  • head -n file 查看文件的前n行

  • tail -n 文件路径 查看文件的末n行

  • wc -l 文件路径 : 统计文件内容的行数。-h表示lines,行数。

    wc -w 文件路径 : 统计文件内容的单词数,依据空格来判断单词数量。-w 表示words,单词数。

    wc -c 文件路径 :统计文件的字节数。-c表示bytes,字节数。

  • ps -ef :查看服务器进程信息。-e 列出全部进程, f 显示全部的列

  • top :查看服务器的进程占的资源(q指令退出)

    M: 将结果按内存从高到低进行降序排列
    P: 表示将结果按照CPU使用率从高到低进行降序排列;
    1: 当服务器拥有多个cpu的时候可以使用“1”快捷键来切换是否展示显示各个cpu的详细信息;

    t: 树形显示

  • du -sh 文件路径 :查看文件的真实大小

  • find 路径 -name *.conf :查询指定路径下以.conf结尾的文件

  • reboot :重启计算机

  • w: 查看ssh连接到本机的情况

  • find / -name +文件名 搜索文件

    locate 文件名 搜索文件

  • watch -n 1 ls -lha 实时显示命令执行结果

    • sudo su

    • sudo !! !!代表上一条命令

    • etc/environment 环境变量表
    • unset name删除环境变量
  • tree -L 1 / 一级,树形,列出根目录

  • 管道命令仅仅处理stdout,对于stderr 会予以忽略,可以使用set -o pipefail 设置 shell遇到管道错误退出

  • lsof 查看端口

  • netstate -napt 查看端口

  • gcc x.c -o x 对x.c进行编译

  • ./a.out 执行a.out

  • wc -l f.txt 查看文件f.txt有多少行

    1. head -n 10 f.txt 查看f.txt的前十行
    2. tail -n 5 f.txt 查看f.txt的后五行
  • touch b.jpg 创建文件b.jpg

  • rm b.jpg 删除b.jpg

  • man ls 查看ls的手册,常见的man文档部分包括:

    • Section 1: User Commands - 用户命令
    • Section 2: System Calls - 系统调用
    • Section 3: C Library Functions - C标准库函数
    • Section 4: Devices and Special Files - 设备和特殊文件
    • Section 5: File Formats and Conventions - 文件格式和约定
    • Section 6: Games and Fun Stuff - 游戏和娱乐内容
    • Section 7: Miscellaneous Information - 杂项信息
    • Section 8: System Administration Commands - 系统管理命令
  • ls –help 查看ls参数的简要说明

  • file 文件名查看文件类型

  • diff 文件1 文件2 比较两个文件是否相同

  • apt update 更新本地的数据库缓存

  • apt show 包 显示包信息

  • apt remove 包 删除包信息

  • apt upgrade 包 自动安装更新

  • 压缩包:打包+压缩

image-20230502192541049

image-20230507160047163

  • 第一列root表示该文件的拥有者,必须在/etc/passwd里面,可以用chown改变

    • chown [-R] 账号名称 文件或目录
    • chown [-R] 账号名称:用户组名称 文件或目录
  • 第二列表示所属用户组,必须在/etc/group里面,可以使用chownchgrp改变

  • 参考

    • sudo useradd xxx

    • sudo su xxx

Docker

参考:https://yeasy.gitbook.io/docker_practice/

  • https://www.runoob.com/docker/docker-hello-world.html

  • docker pull name 获取镜像

  • docker ps 查看运行的容器

  • docker logs 查看容器标准输出

  • docker stop id 命令来停止容器

  • docker info查看docker信息

  • docker images 查看本地镜像

  • docker container ls -a 查看所有容器

  • docker run -dit ubuntu 创建镜像

  • docker exec -it 69d1 bash 进入镜像,从这里exit不会导致镜像结束

进程的使用

  • ./fork & 让可执行程序fork在后台执行,&:让程序在后台执行

  • ps 查看在后台运行的程序

    1. ps -uf u显示当前用户的所有进程,f显示进程之间的关系
    2. ps | grep fork 查看是否有名为fork的进程依然存在
  • kill 给进程发各种信号

    1. kill -9 {PID} 终止某个进程
    2. pkill pkill -9 fork避免不同终端PID不同的问题
  • ctrl+z 把当前命令放入后台,并暂停

  • jobs 查看当前在后台的命令

  • fg %num 将后台的命令调至前台

  • bg %num 将后台暂停的进程在后台执行

  • kill %num 终止命令编号为numd的进程

shell小工具

  • 一个据说更好的shell:zsh

  • man简洁版:tldr

    • tldr ls
  • 在终端查看图片:sudo apt-get install imagemagick

    • display nihao.png
  • MySQL美化:mycli

tmux

image-20230623185136711

  • 新建会话tmux new -s session_name

  • 分离会话tmux detachCtrl+b d

  • 查看所有会话tmux ls

  • 接入会话tmux attach -t session_name

  • 切换会话tmux switch -t session_name

  • 杀死会话tmux kill-session session_name

  • 重命名会话tmux rename-session -t session_name

  • 新建窗口ctrl+b c

  • 切换窗口ctrl+b num

    • ctrl+b p
    • ctrl+b n
  • 窗口划分

    • ctrl+b "上下
    • ctrl+b % 左右
    • ctrl+b +↑↓←→切换pane

SSH连接虚拟机

配置共享文件夹

全是重点!!!

  • 不连接root用户,只连接普通用户,比如szl,所以.ssh/config里面的user应该填szl

  • ip填写这个:

    image-20230813150250968

  • 报错:

    • ip可以ping通,但ssh不能直接连root@192.168.912.132,只能连szl@192.168.912.132
    1
    2
    [22:23:20.608] Terminating local server
    [22:23:20.611] Resolver error: Error: Connecting with SSH timed out

卸载&安装:

  • 停止使用:sudo systemctl stop ssh

  • 卸载:sudo apt-get remove ssh-serversudo apt-get remove ssh-client

  • 安装:sudo apt-get install ssh-serversudo apt-get install ssh-client

  • 启动ssh:sudo systemctl start ssh

  • 查看ssh状态:sudo service ssh status

传送文件

  • 把本地目录传送到远程机器

    1
    scp -r D:\wenjian\Code\Python\Django_module szl@192.168.192.132:/home/szl/桌面/database-lab/lab4/dj
  • 远程机器上下载目录到本地

    1
    scp -r szl@192.168.192.132:/home/szl/桌面/database-lab/lab4/dj D:\wenjian\Code\Python\Django_module
  • 数据从向右流动


C语言工程开发

1.多模块程序

回忆一下,在刚开始学习 C 语言的时候,我们曾经学习过,当我们的程序只有一个main.c文件时,我们可以在命令行中通过

1
gcc -o program main.c

对单个代码文件进行编译,生成可执行文件program,并且通过./program运行编译生成的程序。在我们之前的课程中,计蒜客的学习系统也帮你进行了这样的操作。

相比于单个文件、单一功能的程序,当程序有多个模块时,问题就开始变得复杂了。我们对每一个模块会首先编译出每个模块对应的*.o目标代码文件(relocatable object file),例如:

1
gcc -c -o set.o set.c

会将我们的一个set.c文件编译成一个set.o的目标代码文件。请注意,这里的-c表示生成目标代码文件。-o与之前单文件的时候一样,在它之后我们会写明被生成的文件的名称。

当我们完成了每一个独立模块的编译并获得它们的目标代码文件后,我们可以将我们的主程序的目标代码文件与他们链接在一起。例如:

1
gcc -o program main.o set.o others.o

将目标代码文件set.oothers.omain.o在链接在一起,并且输出了 可执行文件(excutable file)program

我们依然可以通过./program运行编译生成的程序。

当我们将一个程序写在多个文件中时,每一个文件中的变量和函数默认都是只有文件内的部分才可以访问的。但是有一些特殊的全局变量、类型定义、函数可能会需要在多个文件中被使用。

这时候,我们可以将这类的内容单独写成一个 头文件(header file),并且将全局变量、类型定义、函数声明写到头文件中。

对于一个文件set.c,习惯上它的头文件会被命名为set.h。在所有需要用set.h中全局变量、类型定义、声明的函数的文件中,用

1
#include "set.h"

将对应的头文件引入。在这里的引入头文件方式和引入系统库头文件的方式很类似,只不过这里用的是引号""而不是尖括号<>

由于头文件里也可以引入头文件,因此我们可能事实上多次引入同一个文件,比如我们引入1.h2.h,且1.h也引入2.h,这时因为2.h被引入了两次,就有可能出现重复的声明。为了解决这个问题,我们在2.h中定义一个宏,在2.h的最开始判断这个宏是否被定义过,如果被定义过,就跳过2.h整个文件的内容。

这里我们将会用到两个新的预处理指令#ifndef xxx#endif,它们成对出现且#ifndef在前,作用是如果这时并未已定义xxx宏,则这对#ifndef xxx, #endif之间的内容有效。(其中xxx可以替换为任意宏名)

这样2.h可以写为类似于如下的内容:

1
2
3
4
5
6
7
8
9
#ifndef xxx
#define xxx
typedef enum Status { Success, Fail };
typedef struct {
char *name;
int age;
} People;
Status go_to_Jisuanke(People);
#endif

细心的同学已经发现,如果在程序中尚未引入2.h的位置定义了xxx宏,则#include "2.h"中的声明并不会被引入,因此我们不应该在此使用xxx这种平凡的名字。实际上,我们一般会采用一个与头文件名相关的名字来代替xxx,比如一个常用的代码风格里,这个宏的名字形式为工程名_路径名_文件名_H_

2.Makefile

在前面学习多模块程序的时候,我们需要先把每个模块的代码都生成为目标代码文件,然后再将目标代码文件联编成一个可执行文件。如果每一次编译都要输入这么多命令,是不是很复杂呢?如果每次修改一点点内容就需要重新编译整个工程,是不是很浪费时间呢?

为了解决所遇到的问题,方便开发,我们使用一个叫做make的命令,它可以读取Makefile文件,并且根据Makefile中的规则描述把源文件生成为可执行的程序文件。

最基本的Makefile中包含了一系列形式如下的规则。请注意,每一条规则的命令前,必须要有一个制表符\t

1
2
目标: 依赖1 依赖2 ...
命令

例如,我们可以写一条规则:

1
2
array.o: array.c array.h
gcc -c -o array.o array.c

表示生成的文件是目标代码文件array.o,它依赖于array.carray.h。当我们在命令行中执行make array.o时,根据这一规则,如果array.o不存在或者array.carray.h至少之一比array.o更新,就会执行gcc -c -o array.o array.c

我们把上述代码保存为Makefile,与array.carray.h放在同一目录,在那个目录里执行make array.o就能看到效果。注意:Makefile里的除当前目录隐藏文件外的第一个目标会成为运行make不指定目标时的默认目标。

1
2
3
4
5
6
7
8
main: array.o main.o
gcc -o main array.o main.o

main.o: main.c array.h
gcc -c -o main.o main.c

array.o: array.c array.h
gcc -c -o array.o array.c

Makefile有多条规则时,如果我们希望只生成其中一个,我们可以在make命令后加上需要生成的目标的名称。例如,在这里我们可以执行make main.omake array.omake main。当我们执行make main时,make命令发现array.omain.o不存在,就会根据以它们为目标的规则先生成它们。

很多时候,你会需要将.o为后缀的目标代码文件和可执行的程序文件删除,完全从头进行编译。那么我们可以写一条clean规则,例如:

1
2
clean:
rm -f array.o main.o main

按照预期,当我们执行make clean就可以删除array.omain.omain了。事实真的这样吗?

细心的同学已经发现,这时如果已经存在clean文件,rm命令就不会执行了。为了解决这个问题,我们通过一个特殊的方法告诉make这个名为clean的规则在clean存在的时候仍然有效。

1
2
3
4
.PHONY: clean

clean:
rm -f array.o main.o main

.PHONY用于声明一些伪目标,伪目标与普通的目标的主要区别是伪目标不会被检查是否存在于文件系统中而默认不存在且不会应用默认规则生成它。

Makefile中我们还可以使用它的变量和注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 井号开头的行是一个注释
# 设置 C 语言的编译器
CC = gcc

# -g 增加调试信息
# -Wall 打开大部分警告信息
CFLAGS = -g -Wall

# 整理一下 main 依赖哪些目标文件
MAINOBJS = main.o array.o

.PHONY: clean

main: $(MAINOBJS)
$(CC) $(CFLAGS) -o main $(MAINOBJS)

array.o: array.c array.h
$(CC) $(CFLAGS) -c -o array.o array.c

main.o: main.c array.h
$(CC) $(CFLAGS) -c -o main.o main.c

clean:
rm -f $(MAINOBJS) main

上面这个例子已经是一个较为完整的Makefile了。以#开头的是我们的注释,我们在这里用注释说明了我们定义的Makefile变量的用途。CC变量定义了编译器,CFLAGS变量标记了编译参数,MAINOBJS变量记录了main依赖的目标文件。定义的变量可以直接通过$(变量名)进行使用。

3.命令行参数

1
2
3
int main(int argc, char **argv) {
// ...
}

在这里,main函数有两个参数,第一个参数是整数型,会传入命令行参数的个数,程序运行时就可以接收到。第二个参数是char **,其中储存了用户从命令行传递进来的参数

如果我们的程序可执行文件名为main,则在命令行中输入./main hello world我们会得到argc3argv[0]./mainargv[1]helloargv[2]world。如果有更多参数也可以以此类推。

我们不难发现,命令行参数默认都是空格分隔,但是如果我们希望包含空格的一个字符串作为参数,我们则需要在输入参数时用引号将其包裹起来。

如果我们的程序可执行文件名为main,则在命令行中输入./main "hello world" is my greet我们会得到argc5argv[0]./mainargv[1]hello worldargv[2]isargv[3]myargv[4]greet

任何被接收到的argv参数都可以被当做正常的字符串在代码里使用。在很多程序的设计中,我们会需要根据接收到的参数来决定程序的执行方式,这时候,学会使用argcargv就显得很重要了。在之后的课程中,你也会需要运用这一块的知识,一定要学明白喔。

4.文件操作

在之前的课程中,我们学习、设计的所有程序都是从标准输入进行读取、向标准输出进行写出的,操作系统为我们准备好了标准输入、标准输出的界面。在这节课中,我们将要学习如何从文件中进行读取、如何向文件进行写入。

在读文件的时候我们需要先有一个可以让我们访问到文件的 文件指针(file pointer),它是一个FILE类型的指针。

我们可以通过下面的方式声明一个文件指针。

1
FILE *fp;

这时候,如果我们希望对一个文件进行操作,我们需要先使用

1
fp = fopen(文件路径, 访问模式);

将文件指针和文件关联起来,其中第一个参数是一个字符串,对应了我们希望访问的文件路径。第二个参数是访问模式,它可以是表示只读模式的"r",也可以是表示只写模式的"w",还可以是在文件末尾追加的"a"

当我们将文件指针和文件关联起来后,我们就可以通过fgetc(fp);获得当前指针之后位置的一个字符了,每获得一个字符,指针会向后移动一个字符(如果到达文件尾部则会返回EOF)。

我们这时通过fputc('c', fp);的方式将字符'c'写入到fp关联的文件内了。

了解到这些信息后,我们就可以实现将一个文件复制到另一个文件内的函数了,例如:

1
2
3
4
5
6
void filecopy(FILE *in_fp, FILE *out_fp) {
char ch;
while ((ch = fgetc(in_fp)) != EOF) {
fputc(ch, out_fp);
}
}

这个函数接收的两个参数都是文件指针。这个函数会通过一个可读模式的文件指针逐字符地读取,并且通过一个可写模式的文件指针逐字符地将所有字符写出,从而起到复制文件内容的作用。

你需要注意,在给文件指针进行命名的时候,要避开 stdinstdoutstderr 这三个名称。因为这三个名称其实已经用于标准输入、标准输出、标准错误的文件指针。

你可能会问了,那我们看到的 stdinstdoutstderr 的这三个文件指针可以直接使用吗?回答是肯定的。

我们是通过 fgetc(stdin); 获得来自标准输入的字符,也可以通过 fputc(ch, stdout);fputc(ch, stderr); 将变量 ch 中的字符输出到标准输出或标准错误中的。

除了fgetcfputc之外,我们还可以使用fscanffprintf函数。这两个函数都很像我们已经很熟悉的scanfprintf函数,只是不过,scanfprintf 可以被看作 fscanffprintf 的特例。

我们使用 fscanf 从文件指针in_fp进行读取时,可以写成:

1
fscanf(in_fp, "%c", &a);

而如果我们写

1
fscanf(stdin, "%c", &a);

这将完全与下面直接使用 scanf 的方式等价。

1
scanf("%c", &a);

类似地,我们使用fprintf向文件指针out_fp进行写出时,可以写成:

1
fprintf(out_fp, "%c", a);

而如果我们写

1
fprintf(stdout, "%c", a);

这将完全与下面直接使用 printf 的方式等价。

1
printf("%c", a);

在使用文件并且确定不再继续使用后,我们要通过下面所示的方式将文件指针fp与文件的关联断开。你可以将它视为和fopen相反的一个操作。

1
fclose(fp);

如果你不在程序中使用fclose,程序正常结束时,程序会为所有打开的文件调用fclose

stdinstdout 其实也是可以被打开的文件指针,如果你觉得用不到的话,其实也是可以使用 fclose 将他们关闭掉的。你可以自己试一试,关闭 stdinstdout 会对我们以前写过的程序带来什么样的影响呢?



Missing Semester笔记

中文讲义

1.Shell

  • chmod 777 文件 修改权限
  • grep string fail 查找字符串,-R可递归进行

2.Shell 工具和脚本

  • find . -name src -type d
    
    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

    作用:在当前目录查找名为src的目录

    可用参数:

    + `-name <name>`
    + `-path '*/test/*.py'` 查找所有路径中包含test的文件
    + `-type f/d`查找文件、目录
    + `-mtime -1` 查找前一天修改的所有文件
    + `-size +500k/-10M` 查找大于500k的文件 / 小于10M的文件
    + `-exec rm {} \;` 删除查找到的所有文件

    + history 输出历史命令

    +

    #### homework

    3. ```shell
    #!/bin/bash

    marco(){
    export MARCO=$(pwd)
    echo "path: $MARCO "
    }

    polo(){
    cd "$MARCO"
    }
  1. #!/bin/bash
    i=0
    while true; 
    do
        i=$(( i+1 ))
        n=$(( RANDOM % 100 ))
    
        if [[ n -eq 42 ]]; then
            echo "Something went wrong"
            >&2 echo "The error was using magic numbers"
            echo "after $i times, $STDOUT, $STDERR"
            exit 1
        fi
    
     echo "Everything went according to plan"
    done
    
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80









    > 参考链接:https://zhuanlan.zhihu.com/p/102176365,https://www.runoob.com/linux/linux-shell.html

    + `.sh`文件第一行:`#!/bin/bash`
    + 执行`.sh文件``./hello.sh`

    | 类型 | 作用域 | 声明方式 | 规范 |
    | ---------- | -------------------- | ------------------ | ---------------------------- |
    | 自定义变量 | 当前shell | = | 字符串、整型、浮点型、日期型 |
    | 环境变量 | 当前shell及其子shell | export、declare -x | |
    | 系统变量 | 所有shell | 启动加载 | |

    ![image-20230808201017745](image-20230808201017745.png)



    + `declare [-/+]选项 变量泵`

    + a 数组
    + i 整型
    + x 环境变量
    + r 只读变量
    + p 用于显示类型







    **位置参数变量**

    - `$n :$0 代表命令本身、$1-$9代表第1到9个参数,10以上参数用花括号,如 ${10}`
    - $?:从上一条命令中获取错误代码
    - $_:上一个命令的最后一个参数
    - $* :命令行中所有参数,且把所有参数看成一个整体。
    - $@ :命令行中所有参数,且把每个参数区分对待。
    - $# :所有参数个数。
    - 单引号会忽略逃逸字符
    - $$进程ID
    - ![image-20230808201751902](image-20230808201751902.png)



    **注意**

    + `=`两侧不能加空格,否则就是命令







    +

    + `''`中的字符串不考虑转义,`""`中的字符串会转义

    + `mkdir -p /1/2/3` 递归创建目录,不会抛出错误

    + `$(ls)` 先执行ls,执行结果替换$(ls)

    + 在bash中进行比较时,尽量使用双方括号 `[[ ]]` 而不是单方括号 `[ ]`

    + 命令支持`? *`通配符

    + 支持`{}`按行自动展开

    ```sh
    convert image.{png,jpg}
    # 会展开为
    convert image.png image.jpg

+

分支控制

image-20230502190128929

image-20230808202350760

image-20230808202445428

image-20230808202623336

image-20230808202705392

image-20230808203001773

image-20230808203141042

image-20230808203201434

image-20230808203915744

image-20230808204110064

image-20230808204126834

image-20230808204305582

image-20230808204320727

image-20230808204419559

image-20230808204648996

3.Vim

几种模式:

  • 主要:normal,按esc即可进入normal模式
  • i: insert
  • r: replace
  • v: visual
  • sfift + v: visual line
  • ctrl + v: visual block
  • : command line

快捷键:

  • tabnew: 新窗口

  • help instruction: 查看帮助

  • sq: 新窗口

  • qa: 关闭所有窗口

  • hjkl: 左上右下移动

  • 词: w (下一个词), b (词初), e (词尾)

  • 行: 0 (行初), ^ (第一个非空格字符), $ (行尾)

  • 屏幕: H (屏幕首行), M (屏幕中间), L (屏幕底部)

  • 翻页: Ctrl-u (上翻), Ctrl-d (下翻)

  • o在当前光标下面重开一行并切换为INSERT模式

    O上方

  • u撤销上一步(undo)

    • Ctrl+r 重做(redo)
  • d删除 {移动命令}

    • 例如, dw 删除词,de删除到词尾, d$ 删除到行尾, d0 删除到行头。
    • c删除并更改:删除后进入INSERT模式
  • 按两次会作用于整行

  • c删除单个字符

  • r替换单个字符

  • y复制,z粘贴

  • /向下搜索

    ?向上搜索

  • .重复上一步

  • ~修改大小写

vimtutor

  • Ctrl + g 显示文档信息
  • G 移动到文档最后一行
  • gg第一行
  • 数字 + G:跳转到指定的行数
  • s/old/new(/g)(全局)用new替换old
  • :! + command 进行命令行操作

官方讲义:

移动

多数时候你会在正常模式下,使用移动命令在缓存中导航。在 Vim 里面移动也被称为 “名词”, 因为它们指向文字块。

  • 基本移动: hjkl (左, 下, 上, 右)
  • 词: w (下一个词), b (词初), e (词尾)
  • 行: 0 (行初), ^ (第一个非空格字符), $ (行尾)
  • 屏幕: H (屏幕首行), M (屏幕中间), L (屏幕底部)
  • 翻页: Ctrl-u (上翻), Ctrl-d (下翻)
  • 文件: gg (文件头), G (文件尾)
  • 行数: :{行数}<CR> 或者 {行数}G ({行数}为行数)
  • 杂项: % (找到配对,比如括号或者 /* */ 之类的注释对)
  • 查找:f , F ,t ,T
    • 查找/到 向前/向后 在本行的{字符}
    • , / ; 用于导航匹配
  • 搜索: /{正则表达式}, n / N 用于导航匹配
编辑
  • i进入插入模式

    • 但是对于操纵/编辑文本,不单想用退格键完成
  • O / o 在之上/之下插入行

  • d{移动命令}
    
    1
    2
    3
    4
    5
    6
    7

    删除 {移动命令}

    - 例如, `dw` 删除词, `d$` 删除到行尾, `d0` 删除到行头。

    - ```plaintext
    c{移动命令}
    改变 {移动命令} - 例如, `cw` 改变词 - 比如 `d{移动命令}` 再 `i`
  • x 删除字符(等同于 dl

  • s 替换字符(等同于 xi

  • 可视化模式 + 操作

    • 选中文字, d 删除 或者 c 改变
  • u 撤销, <C-r> 重做

  • y 复制 / “yank” (其他一些命令比如 d 也会复制)

  • p 粘贴

  • 更多值得学习的: 比如 ~ 改变字符的大小写

修饰语

你可以用修饰语改变“名词”的意义。修饰语有 i,表示“内部”或者“在内“,和 a, 表示”周围“。

  • ci( 改变当前括号内的内容
  • ci[ 改变当前方括号内的内容
  • da' 删除一个单引号字符串, 包括周围的单引号

vim配置

  • esc映射为capslk:

    C:\Users\Administer\AppData\Roaming\Code\User\keybindings.json中添加一句``

    1
    2
    3
    4
    {
    "key": "capslock",
    "command": "extension.vim_escape"
    }

5.命令行环境

  • ssh myserver journalctl 查看系统日志

  • Ctrl-C的作用是发出一个SIGINT信号,用来中断程序。但程序可以忽略SIGINT信号,这是我们可以用Ctrl+\来发出SIGQUIT

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/python3
    import signal, time

    def handler(signum, time):
    print("\nI got a SIGINT, but I am not stopping")

    signal.signal(signal.SIGINT, handler)
    i = 0
    while True:
    time.sleep(.1)
    print("\r{}".format(i), end="")
    i += 1
  • 暂停:Ctrl+Z 发出SIGTSTP

  • 命令加&后缀会自动放入后台执行


FFmpeg笔记

格式转换

1
2
ffmpeg -i input.mp4 -c:vcopy -c:acopy output.mov
ffmpeg -i input.ts -bsf:a aac_adtstoasc -c:v copy -c:a copyoutputfromts.mp4

视频裁剪

1
ffmpeg -i input.mp4 -ss 10 -t 15 -codec copy cut.mp4
  1. 参数:
  • -i : source

  • -ss:start time

  • -t :duration

  • -c :video,audio codec

注意:原视频只能为mp4、mkv

音视频混流

1
ffmpeg audio.m4s -i video.m4s -acodec copy -vcodec copy output.mp4

注意:这里输入可以是其他类型的文件

字幕视频合并

1
ffmpeg -i 08.mkv -vf "ass=08 简体.ass" out.mp4

Git

笔记

初始

  • 配置的三级作用域:
    • --global作用于当前user,存储在用户目录的.gitconfig文件中
    • --local仅作用于当前仓库
    • 查看配置信息git config -l
  • 初始化一个工作区:git init
  • git add:把文件修改添加到暂存区
  • git commit -m "message":把暂存区所有内容提交到当前分支
  • git remote add name git@github.com:Asxjdb/first.git:关联远程仓库并指定别名name
  • git status -s:查看状态

分支

  • git branch 分支名:创建新分支
  • git branch -d main 删除分支
  • git switch 分支名:切换分支
  • git merge branch111: 把branch111分支合并到当前分支(共同的父结点)
  • git rebase branch111:把当前分支线性合并到branch111
  • git checkout HEAD^ / git checkout HEAD~1在当前分支上移动HEAD标签
  • git branch -f main HEAD~3让分支指向另一个提交:把main分支强制指向HEAD的第三父级
  • git revert main:撤回main分支的一个提交

版本回退

  • git log

远程

  • 连接git remote add origin git@github:Asxjdb/cpu.git
  • 拉取git pull origin main
  • 查看本地、远程所有分支git branch -a
  • 删除远程分支git push origin -d main
  • 创建远程分支并推送git push -u origin master
  • 强制推送git push -f

计蒜客课件

笔记

使用Git分支与版本切换

  • git branch 查看现有分支

  • git branch <分支名> 创建分支

  • git branch -d <分支名> 删除分支

  • git checkout <分支名> / git switch <分支名>切换分支

  • git checkout -b <分支名> / git switch -c <分支名> 创建并切换到分支

  • git stash 储藏当前工作目录现场

  • git stash pop 恢复到最近储藏的现场

  • git stash list 查看所以储藏的现场

  • git stash apply stash@{0} 恢复到指定的储藏现场

  • git stash drop stash@{0} 删除储藏指定位置中的指定现场

1656944206598

1656944307394

1656944394013

1656944440047

1656944471482

1656944510926

1656944559394

1656944580663

1656944597341

1656944620449

1656944632995

1656944645952

1656944660444

1656944682001

1656944704386

1656944715579

1656944733755

1656944844322

实践

  • 使用git status这个命令来查看工作目录中有哪些文件进行过操作
  • 1656999555958

1656999612634

1656999847654

1656999862257

1656999882712

  • git checkout -b dev ==创建并切换到dev分支==
  • git push origin dev ==将dev分支推送到远端仓库==
  • git branch -d 参数 分支名 ==删除本地分支==
  • git push origin --delete suanshu==删除远端仓库的suanshu分支==
  • git branch -a ==查看本地和仓库的所有分支==

Git的远端仓库交互

  • git remote add origin <远端仓库url>关联本地仓库和远端版本库
  • git push origin develop 将本地修改推到远端
  • git pull origin master将远端的修改拉到本地
  • 拉取和推送
    1. git fetch 拉取(全部分支)更新不更新工作目录
    2. git pull拉取(全部分支)更新并根据本地分支对应分支更新工作目录
    3. git pull origin <分支名> 从远端origin的指定分支进行拉取
    4. git push 推动更新
    5. git push origin <分支名> 向远端origin的指定分支名分支进行推送
  • 1657012481840
  • git branch 创建分支
  • git checkout 切换到指定的版本(或通过分支指定的版本)
  • git merge 完成合并:将一个分支的修改应用到当前分支

Git协作之rebase策略

1657017409226

1657017421259

1657017428727

1657017436528

1657017443961

1657017451438

1657017458325

1657017463860

1657017484411

1657017490721

1657017498032

Git仓库配置

1657017562386

1657017544644

1657017584174

Git分支与版本切换

8db546df253398ab48da24827d23267131d0f0b5

040c89762e6897fd692b5b3880a9aea360e68d33

52fe246635118be1ee19eddbe72e762f672007ee

87b5500206916e0ab39bbf14e5a0e51a69cf5abf

2963ee17bf4a1529e6fb2c6510ec2e479808bb3b

6360c458e279859bf515ed83fd162b25a2f3df20

7266b75850f3a45b3a7efd063486e210da5a9672

aec7e124ad8d472f3e5f9e7f870ac3143b4be04f

ba73b5b936398406da0346d550728bda76099303

2a018112e898289ba0ee658129312ed284b43859

4c2cf191ddcd9a41f5f8cb6f4837514e713cee0f

4f059085754da07eee317b442a275d4f078e0ee4

06f2fb7fd182cfad79eedc69f02c237a0adb8041

6dc6573228ce3f3085dd67be4dc28369c999b7fa

6fb6e112375923217ab92b199dede6ff2950e659

7cd12b78dbcee668dd833387ded7f05ec94e1e50

操作系统

来源:https://segmentfault.com/a/1190000039073637

蓝色的表示文件夹,白色的表示文件,绿色表示拥有所有权限,红色表示压缩包

  1. bin : 全称binary(二进制),该目录中存储的都是一些二进制文件,文件都是可以被运行的。
  2. boot: 这里存放一些启动linux时使用的核心文件,包括一些连接文件以及镜像文件。
  3. dev :该目录中主要存放的是外接设备,例如盘,其他的光盘等。其中的外接设备不能直接被使用,需要挂载(类似Windows下的分配盘符)
  4. etc: 主要存储系统管理所需的一些配置文件。
  5. home: 表示“家”,存储除了root用户以外其他所有用户,类似于Windows下的user/用户。在linux中,每个用户都有自己的家目录,一般该目录名以用户的账号命名。
  • /bin 可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等实际上都是一些小的应用程序
  • /home 普通用户的主目录,对应Windows下的C:/Users/用户名/
  • /root root用户的主目录(root用户是具有最高权限的用户,之后会讲)
  • /boot 内核文件的引导目录, 放置 linux 系统启动时用到的一些文件
  • /sbing 超级用户使用的指令文件
  • /tmp 临时文件目录,一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
  • /dev 设备文件目录,在Linux中万物皆文件,实际上你插入的U盘等设备都会在dev目录下生成一个文件,我们可以很方便地通过文件IO方式去操作外设,对嵌入式开发极为友好。
  • /lib 共享库,系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
  • /usr 第三方 程序目录
  • /etc 配置程序目录,系统配置文件存放的目录
  • /var 可变文件,放置系统执行过程中经常变化的文件
  • /opt 用户使用目录,给主机额外安装软件所摆放的目录。

SQL

语句

基本

  • 进入MySQL

    1
    mysql -u root -p 111
  • 查看有哪些库

    1
    show databases;
  • 查看某一库中的表单

    1
    2
    use sakila; // 使用指定表单
    show tables; // 查看sakila数据库中的表单
  • 查看表单中的列/ 字段/ 属性/ 数据项

    1
    desc payment;
  • 导出到文件

    1
    2
    select * from 19info, grade where 19info.`学号` = grade.`学号` into outfile '/var/lib/mysql/baoyan19'
    注意只能导出到 /var/lib/mysql/baoyan19这个文件夹

    从文件导入

    1
    2
    load data infile '/your/file/path/country' into table country
    追加到country中,country需要有属性名
  • 查看当前数据库

    1
    select database();
  • 查看当前用户

    1
    select user();
  • 单行注释

    1
    2
    -- 要有一个空格
    # 空格
  • 合并

    1
    group_conc

DDL

  • create: table, view, index

  • drop: table, view, index

  • alter: table

  • alter

1
2
3
4
5
6
7
8
9
10
11
# 添加
alter table student
add scome date

# 修改
alter table stuednt
modify scome date

# 删除
alter table student
drop unique(sname)
  • 删除表

    1
    DROP TABLE table_name;

视图

  • 创建

    1
    2
    create view view_name [列名]
    as 子查询

安全

静态约束

1
2
3
4
5
6
7
8
{NOT NULL | DEFAULT value | 
[CONSTRAINT constraint_name]
{UNIQUE
| PRIMARY KEY
| CHECK(search_cond)
| REFERENCES tablename [(colname)]
[ON DELETE {CASCADE | SET NULL}]}
}

例:

1
2
3
4
5
6
7
8
9
10
Create Table Student ( 
Sno char(8) not null unique, # 相当于主键了
Sname char(10) default '张三', # 默认值
Ssex char(2) constraint ctssex check (Ssex='男' or Ssex='女'), #给出值域
Sage integer check(Sage>=1 and Sage<150),
Dno char(2) references Dept(Dno) on delete cascade, # 可以这样指定外键,并规定同步删除
sclass char(6) check(Sno in (select Cno form course)), # check里面可以有select语句
constraint ctcc check(chours/credit=20), #表约束:必须这样定义(另起一行)
foreign key(Dno) references Dept(Dno) on delete csacade # 表约束:指定外键,并同步删除
);

断言

1
2
create assertion assertion_name 
check (...)

触发器

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
34
35
36
# 工资只能升不能降
# 触发器的PL/SQL块中应用OLD和NEW时,必须在它们之前加冒号(:),属于固定用法,但在WHEN子句中则不能加冒号
# before
create trigger teacher_chgsal
before update of salary on teacher
referencing new x, old y
for each row
when(x.salary < y.salary) begin
raise_application_error(-20003, 'invalid salary on update');
end

# 下标加一
# after
create trigger sumc
after insert on sc
referencing new row newi
for each row begin
update student set SumCourse = SumCourse + 1
where Sno =: newi.Sno;
end;

# 同步更新
create trigger updSno
after update of Sno on student
referencing old oldi, new newi
for each row begin
update sc set Sno = newi.Sno where Sno = :oldi.Sno ;
end;

# 同步删除
create trigger delSno
after delete on Student
referencing old oldi
for each row begin
delete sc where Sno = :oldi.Sno;
end;

拓展

  • 第三方工具mycli:支持SQL语法高亮、自动补全,
    • 使用方式:mycli -uroot -p111

机场

image-20230531172442342

image-20230531172501554

个人博客

https://fluid-dev.github.io/hexo-fluid-docs/

评论插件

  • hexo g 生成静态网页
  • hexo s 本地预览效果
  • hexo d 上传到github
  • hexo g -d 生成静态网页后直接上传github
  • hexo new file_name 新建博客

文件解析:

  • scaffolds/post.md:博客的自动生成部分

格式

  • 题目用四级标题
  • 分类用三级标题

书写流程

  1. hexo new "blog_name" 新建文章

  2. 使用typora打开博客文件(方便添加图片、利于书写)

  3. typora配置

    image-20230917142257481

  4. 写完后,在vscode中打开博客文件,ctrl + F2选中所有图片的第一段URL,删除。效果如下:![](111111111.png)

  5. hexo g 生成

  6. hexo s 在本地打开

  7. hexo d 上传


命令行笔记
https://asxjdb.github.io/2023/10/09/Linux笔记/
作者
Asxjdb
发布于
2023年10月9日
许可协议