Lane
the missing semester

the missing semester

the missing semester

lectrue 1-the shell(based on LINUX)

快捷键启用终端(最重要的事,我们以下的操作都是基于bash环境进行的)

1
2
3
4
ctrl+alt+t
ctrl+u #清除当前正在输入的指令
ctrl+l #等同于clear,清屏
ctrl+c #终止正在进行的指令

环境变量

1
2
3
4
┌──(kali㉿kali)-[~]
└─$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
#获取环境变量(环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数) 配置完成后不用在安装目录中打开或运行文件 直接可以通过cmd进行运行

路径

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
pwd #打印当前路径
cd #变换目录
──(kali㉿kali)-[/home]
└─$ cd kali

┌──(kali㉿kali)-[~]
└─$ ls #列出根目录下的子目录
Desktop Documents Downloads Music Pictures Public Templates Videos

┌──(kali㉿kali)-[~]
└─$ cd .. #进入根目录

┌──(kali㉿kali)-[/home]
└─$ ls
kali lost+found

cd ~ #在Linux系统中,波浪符号(~)在命令行中表示当前用户的主目录。它是一个简便的方式来访问和引用当前用户的主目录路径。例如,如果当前用户是"john",那么波浪符号(~)将代表"/home/john"。以下是一些使用波浪符号的例子:

-- help #获得更多信息

┌──(kali㉿kali)-[~/Desktop]
└─$ ls -l
total 30128
-rwxrw-rw- 1 kali kali 30847579 Feb 3 23:29 passport.txt

cd /
ls -l #会发现权限拥有者为root 即为everyone

文件操作

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
┌──(kali㉿kali)-[~/Desktop]
└─$ mv passport.txt solvewifi.txt
# 类似于重命名
┌──(kali㉿kali)-[~/Desktop]
└─$ ls
solvewifi.txt

┌──(kali㉿kali)-[~/Desktop]
└─$ cp solvewifi.txt ../haveatry.txt
# 复制并且指定路径
┌──(kali㉿kali)-[~/Desktop]
└─$ cd ..

┌──(kali㉿kali)-[~]
└─$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos haveatry.txt

┌──(kali㉿kali)-[~/Desktop]
└─$ rm ../haveatry.txt
#删除文件
rmdir #清空该目录下的所有文件
mkdir #创建新的目录
pay attention
┌──(kali㉿kali)-[~/Desktop]
└─$ mkdir my code

┌──(kali㉿kali)-[~/Desktop]
└─$ ls
code my solvewifi.txt

┌──(kali㉿kali)-[~/Desktop]
└─$ mkdir "my code"

┌──(kali㉿kali)-[~/Desktop]
└─$ ls
code my 'my code' solvewifi.txt

手册

1
2
3
man+“command”
ctrl + l #清除终端并返回

链接不同的文件(shell中强大的功能)

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
┌──(kali㉿kali)-[~/Desktop/my code]
└─$ echo hello >hello.txt

┌──(kali㉿kali)-[~/Desktop/my code]
└─$ cat hello.txt
hello
# cat命令用来打印文件的内容
┌──(kali㉿kali)-[~/Desktop/my code]
└─$ cat hello.c

# include<stdio.h>
int main()
{
printf("what a fucking world");
return 0;
}

┌──(kali㉿kali)-[~/Desktop/my code]
└─$ ls
hello.c hello.txt hello1.c

┌──(kali㉿kali)-[~/Desktop/my code]
└─$ <hello.txt> hello.c

┌──(kali㉿kali)-[~/Desktop/my code]
└─$ cat hello.c
hello
# 重定向操作,并且在命令前使用cat不会影响任何东西
< file1 #重定向file1至输入流
> file2 #重定向file2至输出流 例如 ls > filelist.txt (将当前目录的内容列表输出到filelist.txt,覆盖文件原有内容 )
#<hello.c>>hello1.c 双端链接表示追加

管道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#在Linux中,“|”符号被称为管道(pipe)操作符。管道在Unix和Linux中被用于将一个程序的输出(STDOUT)连接到另一个程序的输入(STDIN)。这是一种在线程之间传输信息的方法。
┌──(kali㉿kali)-[~]
└─$ ls -l | tail -n1 > ls.txt
# tali通常查看文件的最后一行该命令行将管道与前文的交互式进行综合
┌──(kali㉿kali)-[~]
└─$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos ls.txt

┌──(kali㉿kali)-[~]
└─$ cat ls.txt
-rw-r--r-- 1 kali kali 0 Feb 22 17:58 ls.txt

# tee命令
# tee 是一个Unix和Linux常用的命令行工具,它主要用于在将输出内容重定向到文件的同时,也在终端显示输出结果。tee 命令的名称来源于T型管道,其形象地解释了 tee 的功能: 它会将输入从一个位置(如:一个命令的输出)分流到两个位置(如:屏幕和一个文件)。
┌──(kali㉿kali)-[~/Desktop/my code]
└─$ echo "what a fucking world" | tee hello.txt
what a fucking world

┌──(kali㉿kali)-[~/Desktop/my code]
└─$ cat hello.txt
what a fucking world

进入管理员权限

1
sudo su #切换身份

lectrue2-shell tools and scripting

shell scripting

shell中类似于高级语言的东西

1
2
3
4
5
6
7
8
9

lane@lane-virtual-machine:~$ foo=bar
lane@lane-virtual-machine:~$ echo $foo
bar
lane@lane-virtual-machine:~$ foo = bar
找不到命令 “foo”,
lane@lane-virtual-machine:~$ echo "value is $foo"
value is bar #但是单引号¥foo无法被替换

source 加载脚本函数

1
2
3
4
5
lane@lane-virtual-machine:~$ vim mcd.sh
lane@lane-virtual-machine:~$ source mcd.sh #mcd函数加载进shell中
lane@lane-virtual-machine:~$ mcd test #执行函数
lane@lane-virtual-machine:~/test$

bash中特殊变量

1
2
3
4
5
6
7
8
$0 #脚本名
$1~$9 #脚本参数
$@ #所有参数
$# #参数个数
$? #前一个命令返回数
$$ #当前脚本进程识别码
!! #完整的上一条命令所有信息(若不行,可用sudo !!进行尝试)
$- #上一条命令的最后一个参数

bash变量

1
2
3
4
5
6
7
8
#$? 返回上一条指令的成功与否(1为失败,0为成功)
lane@lane-virtual-machine:~/test$ true
lane@lane-virtual-machine:~/test$ echo $?
0
#并且逻辑运算符与c语言一致

#$(pwd)打印路径

命令替换与进程替换

1
2
3
$( CMD ) 命令替换 (command substitution):通过 $( CMD ) 这样的方式来执行CMD 这个命令时,它的输出结果会替换掉 $( CMD ) 。例如,如果执行 for file in $(ls) ,shell首先将调用ls ,然后遍历得到的这些返回值。

<( CMD ) 进程替换(process substitution) :<( CMD ) 会执行 CMD 并将结果输出到一个临时文件中,并将 <( CMD ) 替换成临时文件名。这在我们希望返回值通过文件而不是STDIN传递时很有用。例如: diff <(ls foo) <(ls bar) 会显示文件夹 foo 和 bar 中文件的区别。

example.sh(一个例子)(Bash是一种命令语言,通常运行于文本窗口中能执行用户直接输入的命令,还能从SH文件中读取命令一般作为内置于操作系统的应用程序向用户提供访问操作系统内核的服务。)

1
2
3
4
5
6
7
8
9
10
11
12

echo "starting program at $(date)" #这一行输出一条信息至控制台,标识脚本开始运行的时间。其中$(date) 是一个命令替换,会被替换为当前日期和时间。

echo "running program $0 with $# arguments with pid $$" #该行再次在控制台打印一条信息,包含了脚本的名称($0),参数的数量($#) 和当前进程的PID($$)。

for file in "$@"; do #这行开始了一个for循环,将处理脚本接收的每一个参数。"$@"代表所有的参数列表,每一个参数(这里是一个文件名)都会被赋值给变量file
grep foobar "$file" > /dev/null 2> /dev/null #这行代码在当前文件中查找文本"foobar"。其中 > /dev/null将 grep 命令的标准输出重定向到/dev/null,也就是丢弃,2> /dev/null将所有错误消息也丢弃。
if [["$?" -ne 0]]; then #这行检查前一条命令(即grep命令)的退出状态。为0表示成功,非0则可能表示失败或其他一些状态。这里,如果grep命令未找到"foobar",它将返回1,执行then后面的代码块。
echo "File $file does not have any foobar,adding one"
echo "# foobar" >> "$file"
fi
done #这两行分别结束了if语句和for循环

通配符

  • 通配符 - 当你想要利用通配符进行匹配时,你可以分别使用 ? 和 *
    来匹配一个或任意个字符。例如,对于文件foo, foo1, foo2, foo10 和 bar, rm foo?这条命令会删除foo1 和 foo2 ,而rm foo* 则会删除除了bar之外的所有文件。

  • 花括号{} - 当你有一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。

1
2
3
4
5
6
7
8
9
10
11
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg

cp /path/to/project/{foo,bar,baz}.sh /newpath
# 会展开为
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath

# 也可以结合通配使用
mv *{.py,.sh} folder
# 会移动所有 *.py 和 *.sh 文件

shell tools

如何在终端进行创立,写入并编译运行.c 文件

1
2
3
4
5
6
touch hello.c
vim hello.c #进入vim编写页面
#首先点击“i” 进入插入模式,我们此时可以进行文件的编写
#然后编写完成后,点击“esc”,在点击“:wq”保存并推出
gcc hello.c -o out -Wall #编译并生成out.exe 执行文件
./out #执行文件

查看命令如何使用

  1. 对应命令行前添加–help
  2. 使用 man 命令

查找文件

  • 所有的类unix系统都包含find命令 ,其会递归地搜索符合条件的所有文件
1
2
3
4
5
6
7
8
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
  • 除了查找文件还可通过对查找到的文件进行操作(利用-exec+操作{}+)

更高效的工具:

fd 就是一个更简单、更快速、更友好的程序,它可以用来作为find的替代品。它有很多不错的默认设置,例如输出着色、默认支持正则匹配、支持unicode并且它的语法更符合直觉。以模式PATTERN 搜索的语法是 fd PATTERN。

locate : 通过编译索引或建立数据库的方式来实现更加快速地搜索。locate 使用一个由 updatedb负责更新的数据库,在大多数系统中 updatedb 都会通过 cron每日更新。这便需要我们在速度和时效性之间作出权衡。locate只能通过文件名检索。

查看文件内容

查看文件的内容使用grep命令,它是用于对输入文本进行匹配的通用工具。

经常使用的选项有 :

-C :获取查找结果的上下文(Context);

-v: 将对结果进行反选(Invert),也就是输出不匹配的结果。

-R: 递归搜索子目录

更高效的工具:ripgrep

查找shell中命令

  1. 按向上的方向键会显示你使用过的上一条命令,继续按上键则会遍历整个历史记录。
  2. history 命令允许您以程序员的方式来访问shell中输入的历史命令。
  3. 使用 Ctrl+R 对命令历史记录进行回溯搜索。反复按下就会在所有搜索结果中循环。

directory navigation

强烈推荐使用nnn 它是一种通过箭头进行交互的查看文件的方式(很适用于我bushi)

lecture3-editor(vim)

modal editing

Vim的设计以大多数时间都花在阅读、浏览和进行少量编辑改动为基础,因此它具有多种操作模式:

  1. 正常模式 :在文件中四处移动光标进行修改
  2. 插入模式:插入文本
  3. 替换模式:替换文本
  4. 可视化(一般,行,块)模式:选中文本块
  5. 命令模式:用于执行命令
    (在不同的操作模式下,键盘敲击的含义也不同。)
1
2
3

按下 <ESC> (退出键) 从任何其他模式返回正常模式。 在正常模式,键入 i 进入插入 模式, R 进入替换模式, v 进入可视(一般)模式, V 进入可视(行)模式, <C-v> (Ctrl-V, 有时也写作 ^V)进入可视(块)模式, : 进入命令模式。

常用命令

1
2
3
4
5
6
7
:q #退出(关闭窗口)
:w #保存
:wq #保存并退出
:e {文件名} #在该路径下进行文件的编辑
:ls #显示打开的缓存
:help +命令 #打开vim的命令相对应的帮助文档
:qa #退出vim

vim设计的初衷便是按照编程语言,在终端上面通过键入命令,来更好地对文件进行编辑与保存

移动

1
2
3
4
5
6
7
8
通过箭头光标进行基本移动
词:w(下一个词),b(上一个词(词初)),e(下一个词(词尾))
行: 0 (行初), ^ (第一个非空格字符), $ (行尾)
屏幕: H (屏幕首行), M (屏幕中间), L (屏幕底部)
翻页: Ctrl-u (上翻), Ctrl-d (下翻)
文件: gg (文件头), G (文件尾)
行数:{行数}G ({行数}为行数)
杂项: % (找到配对,比如括号或者 /* */ 之类的注释对)

可视化

1
2
3
v 可视化
V 可视化行
ctrl+v 可视化块

编辑

就我个人而言,比较习惯使用单个打字与删除插入
所以常常 i 进入插入模式即可

一些自认为比较有用的编辑命令

1
2
3
4
u #撤销
yy # 复制光标所在行
nyy # 复制包括光标所在行下的n-1行
p #粘贴

将命令与数字结合

1
2
3
3w 
5j
7dw #删除7个词

改变内容

1
2
ci( #改变当前()括号内容
ci[ #改变当前中括号内容

lectrue 4-data wrangling

观众老爷能赏口饭吃吗

图片的替代文字

本文总阅读量
本文作者:Lane
本文链接:https://lakerswillwin.github.io/2024/05/03/the missing semester/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可