Skip to content

目录

/:Linux文件系统的最上层目录,其他所有目录均是该目录的子目录

/bin:Binary的缩写,存放用户的可执行程序,例如cp和mv等;也存放Shell,如bash和csh。不应把该目录放到一个单独的分区中,否则LinuxRescue模式无法使用这些命令。

/boot:内核就放在这里;操作系统启动时所需的文件,包括vmlinuz和initrd.img等,这些文件若损坏常会导致系统无法正常启动,因此最好不要做任意改动

/etc:   包含很多文件.许多网络配置文件也在/etc 中.

/dev:设备文件目录,例如/dev/sda表示第一块SCSI设备,/dev/hda表示第一块IDE设备(后面会讲到Linux中对SCSI和IDE接口硬盘的表示方法)

/home:普通用户的主目录或FTP站点目录,一般存放在/home目录下。

/usr:系统级的目录,可以理解为C:/Windows//usr/lib理解为C:/Windows/System32

/usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。

/opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。

源码放哪里? /usr/src:系统级的源码目录。 /usr/local/src:用户级的源码目录。

常用命令

查看已安装程序

shell
dpkg --list

删除程序

shell
sudo apt-get remove dante-server && sudo apt-get autoremove

nohup

nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入,所以说添加 & ( 表示“and”的符号)到命令的尾部。

bash
nohup java -jar shop-admin-s.jar &

nohup.out的查看日志方法

bash
// 实时查看
tail -f nohup.out
//  查看最后1000行日志文本
tail -1000 nohup.out

nohup.out文件过大

nohup.out会一直一直自己增长下去,因此就有了我们不停止服务直接,清空nohup.out文件的方法。 两个可以不用停止WEB服务就可以清空nohup.out的命令。

bash
// 第一种 :/dev/nul把它丢弃一切写入其中的数据 意思就是把空的复制粘贴 给nohup.out
cp /dev/null nohup.out
// 第二种: 把无底洞定向输出到 nohup.out 起到清空作用
cat /dev/null > nohup.out

输入输出重定向

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中

bash
nohup java -jar shop-admin-s.jar &

####将标准错误输出重定向到标准输出到当前目录下叫log的文件

注意不能写反 >log 一定要写在前面 : 意思是1指向log文件,2 指向1,所以2也指向log满足输出到log。

如果是错误写法,则为2指向1,又因为1默认指向屏幕 ,所以2指向屏幕,然后 >log 造成1重新指向log

bash
// 标准错误输出和标准输出都定向到log中  
nohup java -jar shop-admin-s.jar >log 2>&1 &
// 简写
nohup java -jar shop-admin-s.jar &>log &

什么信息也不要

bash
nohup java -jar shop-admin-s.jar >/dev/null 2>&1 &

只输出错误信息

bash
nohup java -jar shop-admin-s.jar >/dev/null 2>log &

关于/dev/null文件

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

Docker 常用命令

shell
docker start [容器 ID]:启动一个或多个已经被停止的容器

docker stop [容器 ID]:停止一个运行中的容器

docker restart [容器 ID]:重启容器

docker rm -f [容器 ID] 删除容器

service docker restart 重启docker

docker ps -a 查看所有容器

Docker容器修改dns

AdGuardHome 安装及部署

(1)Bridge 网络模式

javascript
docker run -d \
    --name adguardhome \
    -v $PWD/adguardhome/work:/opt/adguardhome/work \
    -v $PWD/adguardhome/conf:/opt/adguardhome/conf \
    -p 53:53/tcp \
    -p 53:53/udp \
    -p 3000:3000/tcp \
    adguard/adguardhome

(2)Host 网络模式

Host 网络模式直接使用宿主机的网络,没有网络隔离,不需要考虑容器端口的映射,在容器启动后可以自由调整被占用的端口。适合在本机使用 (lo­cal­host),或者直通外网的设备对外开放服务,就比如 VPS 、主路由。

javascript
docker run -d \
    --name adguardhome \
    --restart unless-stopped \
    --log-opt max-size=1m \
    --network host \
    -v $PWD/adguardhome/work:/opt/adguardhome/work \
    -v $PWD/adguardhome/conf:/opt/adguardhome/conf \
    adguard/adguardhome

1、端口冲突

在 Linux 设备上运行 AdGuard Home,通常会出现 53(本地 DNS 服务器)、68(DHCP 客户端)、80(Http)、443(Https) 端口冲突的问题,可以通过netstat -tunlp | grep端口号 查询占用进程。有两种解决方案:使用不同端口、停用冲突进程。 如果是通过 Docker 方式运行 AdGuard Home,

出现 ​listen udp 0.0.0.0:53 bind: address already in use​ 的提示,需要手动处理,方法如下:

javascript
#停止 DNSStubListener
systemctl stop systemd-resolved

#创建文件夹(如果不存在)
mkdir /etc/systemd/resolved.conf.d/

#使用 Nano 创建配置文件2021-04-29 16:16:00 星期四
nano /etc/systemd/resolved.conf.d/adguardhome.conf

在编辑器中粘贴以下内容:

javascript
[Resolve]
DNS=127.0.0.1
DNSStubListener=no

保存后执行以下命令。

javascript
#创建备份
sudo mv /etc/resolv.conf /etc/resolv.conf.backup

#将 /etc/resolv.conf 链接至 /run/systemd/resolve/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

#重启 DNSStubListener
systemctl restart systemd-resolved

完成后使用 netstat -tunlp | grep 53 命令检查是否依旧有进程占用 53 端口,如无冲突,重启 AdGuard Home 容器即可。

How to exit the Vim editor?

点击ESC进入“正常模式”,然后输入“:”,进入“命令模式”。此时屏幕的下方会出现一个冒号,你可以输入以下命令,并按“ENTER”执行:

:q ,退出(:quit的缩写)

:q!,退出且不保存(:quit!的缩写)

:wq,保存并退出

:wq!,保存并退出即使文件没有写入权限(强制保存退出)

:x,保存并退出(类似:wq,但是只有在有更改的情况下才保存)

:exit,保存并退出(和:x相同)

:qa,退出所有(:quitall的缩写)

:cq,退出且不保存(即便有错误)

你也可以直接在“正常模式”下输入“ZZ”来保存并退出Vim(和:x相同),或者“ZQ”不保存并退出(和:q!相同)注意此处ZZ大写和小写是完全不同的。

Vim还有一个帮助菜单,可以通过“:help”调出来,基本能够解决你的绝大多数问题。

img

使用Gost搭建一个快速简单的Socks5代理通道

常规安装 AMD64框架机型

shell
wget "https://github.com/ginuerzh/gost/releases/download/v2.8.1/gost_2.8.1_linux_amd64.tar.gz"

tar -zxvf gost_2.8.1_linux_amd64.tar.gz

mv gost_2.8.1_linux_amd64/gost /usr/bin/gost

chmod +x /usr/bin/gost

开启代理

## 无需认证(修改端口号即可)
gost -L socks5://:1080
gost -L socks5://:2391
## 开启认证(其中的 “账号” “密码” “端口” 自行修改)
gost -L 账号:密码@:端口 socks5://:端口
gost -L diy:diy@:2391 socks5://:2391
## 测试没问题后可以用`nohup`命令挂载到后台运行,重启失效,再次挂载即可重新使用;
nohup gost -L 账号:密码@:端口 socks5://:端口 > /dev/null 2>&1 &

关闭代理

kill -9 $(ps aux | grep "gost" | sed '/grep/d' | awk '{print $2}')

编辑/etc/gost.json文件可修改配置数据 如果使用宝塔面板需要在面板放行设置的端口

查看文件大小

bash
du -h –max-depth=1 *

设置时区

bash
修改设置Linux服务器时区
方法 A
命令 "tzselect"

composer安装插件时无法连接或者无反应

原因: 可能的原因是 composer 的安装包网址是国外镜像所致,被长城防火墙屏蔽了。可执行以下命令来解决:

  1. 修改为国内镜像。可选择以下任一镜像源进行配置:
    • Packagist 中国全量镜像

      bash
      composer config -g repo.packagist composer https://packagist.phpcomposer.com
    • 阿里云镜像

      bash
      composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

常用命令

终端入门:在Ubuntu中,终端是执行命令和与系统进行交互的主要方式。你可以通过按下Ctrl + Alt + T快捷键打开终端。在终端中,你可以输入各种命令来执行各种操作。

ls列出当前工作目录中的所有文件和目录
ls -R递归显示出当前工作目录包含的所有子目录和子文件
ls -a在列出文件时,同时列出隐藏文件
ls -al列出文件和目录,同时显示文件类型,权限等详细信息
cat > filename创建一个新文件
cat filename显示文件内容
cat file file2 > file3file和file2文件内容,输出到新文件file3中
rm filename删除文件
sudo nautilus管理员身份启动任务管理器
cd进入主 home 目录
cd /上级目录名称回到上级目录
cd ..回到上级目录
pwd显示当前所在的目录
mkdir创建一个新的目录
mkdir {test1,test2}或 test1 test2创建多个新的目录
rm删除文件或目录
cp复制文件
cp -a test testbak复制目录 testtestbak 目录,更全面
cp -r test testbak复制目录 testtestbak 目录
mv移动文件或目录
sudo rm -rf ~/.local/share/Trash/*清空回收站
cat &让cat进程在后台运行
kill [options] PID结束进程 options = -9 代表 SIGKILL(强制终止进程)
ps -au查看所有用户进程
top动态查看进程列表
只显示特定用户的进程,按下键盘上的U键。
然后,输入用户名net并按下回车键。
这样,top将仅显示属于该用户的进程
要杀死指定进程号的进程,按下K键。
输入要终止的进程ID。
这将发送默认的SIGTERM信号给指定的进程
Ctrl+C结束进程
Ctrl+Z挂起进程
jobs查看挂起进程
bg切换到后台执行
fg切换到前台执行
sudo find /root -name "newfile"查找 root 目录下的所有名为 newfile 的文件
> test.ini创建空文件,且不输入文件内容
ls > test.ini创建空文件,且不输入文件内容
touch test.ini若所创建的文件不存在,则创建该文件;
且不允许输入文件内容
echo "选填" > isTester.ini若文件不存在,则创建文件;
若文件存在,则覆盖文件;
若文件不存在,使用>>创建文件并追加内容;
若文件存在,使用>>追加文件内容;
vi/vim使用vi或vim命令创建文件并编辑文件
ln [源文件] [目标文件]建立硬连接
ln -s [源文件/目录] [目标文件/目录]建立软连接
ln –snf [新文件/目录] [目标]修改软链接
rm –rf test删除软链接
man查看命令帮助
gzip压缩
mv a.zip b.zip重命名
tar -tf 压缩包.tar | xargs rm -rf撤销压缩
stdin标准输入,文件描述符0
stdout标准输出,文件描述符1
stderr标准错误,文件描述符2
find /etc/mail 2> /dev/null查找文件,将错误信息重定向到null
mount IP:NFS 目录 本地挂载目录客户端挂载 NFS
mount -t nfs4查看已挂载的 NFS 挂载点
sudo nautilus管理员启动文件管理器
tftp IP链接指定tftp服务
------
gcc -c -o-o 用于将汇编操作的结果输入到指定文件中
gcc -c main.c -o a.o编译
gcc main.o链接
gcc main.c编译链接
gcc main.c -o main -g-g 即可生成满足 GDB 要求的可执行文件
gcc -E处理头文件与预编译语句。如:#include #if 生成 .i 文件
gcc -S生成汇编代码 .s
gcc -c翻译汇编代码为机器码 .o
gcc -o链接,生成可执行文件
gcc -O对程序进行优化编译、链接,提高程序的执行效率
gcc -static设置静态库,默认动态库
gcc -I /home/net/my.h指定头文件
gcc -L指定库文件目录
gdb ./test启动GDB调试器
break 行数设置断点
info b查看断点信息
run运行程序
next/step单步执行程序
continue继续运行到下一个断点

包管理器:Ubuntu使用apt作为包管理器,用于安装、更新和卸载软件包。以下是一些常用的包管理器命令:

apt update更新软件包列表
apt upgrade升级已安装的软件包
apt install [package]安装指定的软件包
apt remove [package]卸载指定的软件包
apt-get remove --purge [package]卸载软件包,purge 卸载软件包及其相关的配置文件
dpkg -L [package]列出已安装软件包的文件和目录

系统信息和状态:了解系统的一些基本信息和状态对于调试和故障排除非常有帮助。以下是一些常用的命令:

uname -a显示系统的内核版本和其他信息
lsb_release -a显示Ubuntu发行版的信息
top显示系统的实时进程和资源使用情况
df -h显示磁盘空间的使用情况
free -h显示系统内存的使用情况

文件搜索和查找:有时候你可能需要在系统中搜索文件或查找特定的内容。以下是一些实用的命令:

find /path/to/directory -name "filename"在指定目录中查找文件
grep "pattern" filename在文件中查找指定的模式
locate filename使用文件索引数据库快速查找文件

用户和权限管理:Ubuntu允许你管理用户和控制文件权限。以下是一些常用的命令:

sudo adduser username创建新用户
sudo deluser username删除用户
sudo passwd username修改用户的密码
chmod更改文件或目录的权限
chown更改文件或目录的所有者

详解

img

硬连接和软连接

  1. 硬连接(Hard Link)

    • 硬连接是文件系统中的一个概念,它允许一个文件拥有多个硬连接。
    • 所有硬连接都指向同一个物理数据块,因此它们共享相同的数据内容。
    • 删除一个硬连接并不会影响其他硬连接,只有当所有硬连接都被删除后,文件的数据块才会被释放。
    • 硬连接不能跨越文件系统边界,它们必须位于同一个文件系统中。
    • 硬连接没有关联的文件路径,只有一个inode,因此它们不能指向目录。
  2. 软连接(Symbolic Link)

    • 软连接是一个特殊类型的文件,其中包含了指向另一个文件或目录的路径。
    • 软连接不拥有自己的数据内容,它只是一个指向其他文件或目录的符号。
    • 删除原始文件或目录不会立即删除软连接,软连接会变为“悬空”,即指向不存在的路径。
    • 软连接可以跨越文件系统边界,因为它们只存储路径信息。
    • 软连接可以指向目录,也可以指向文件。

​ 当硬链接的源文件被删除时,硬链接本身仍然可以访问相同的数据内容,因为硬链接与原始文件共享相同的inode和数据块。删除原始文件只会减少硬链接计数,而不会影响硬链接本身。

​ 硬链接的工作方式是通过inode来实现的。每个文件(包括硬链接和原始文件)都有一个唯一的inode号码,inode包含文件的元数据和数据块的位置。当你创建一个硬链接时,它实际上是另一个指向相同inode的入口点,所以硬链接和原始文件都指向相同的数据块。硬链接的计数会增加1,表示有多个入口点指向inode。

less 查看文本文件内容

  1. 查看文本文件:要查看文本文件,只需在终端中输入 less 命令,后跟文件名,如下所示:

    bash
    less filename.txt
  2. 向下滚动文本:按下键盘的 空格键(空格)或 Page Down 键来向下滚动一页。

  3. 向上滚动文本:按下键盘的 Page Up 键或 b 来向上滚动一页。

  4. 向前滚动一行:按下 向下箭头键j 键。

  5. 向后滚动一行:按下 向上箭头键k 键。

  6. 退出 less:按下 q 键,以退出 less 并返回到终端提示符。

  7. 搜索文本:按下 / 键,然后输入你要搜索的文本,按下回车键。less 会高亮显示匹配的文本,并显示匹配的位置,按下 n 键来查找下一个匹配项,按下 N 键来查找上一个匹配项。

  8. 退出搜索:按下 Esc 键。

  9. 前往指定行数:按下 : 键,然后输入要跳转到的行数,按下回车键。

  10. 按 v 进入编辑模式,按ctrl X 退出编辑。

tar

tar 命令用于创建、查看和提取归档文件,通常用于打包和压缩文件和目录。tar 命令的参数和选项有很多,下面是一些常见的参数和选项的详细解释:

bash
tar -cf test.tar test
创建打包文件
gzip test.tar
压缩文件

tar -czvf archive.tar.gz /path/to/files
创建一个使用 gzip 压缩的归档文件
tar -xvzf test.tar.gz
解压压缩文件

创建归档文件:

  • -c:创建一个新的归档文件(通常与 -f 选项一起使用)。

  • -f:指定归档文件的名称。例如,-f archive.tar 将创建一个名为 archive.tar 的归档文件。

添加文件到归档文件:

  • -r:向归档文件中添加文件。
  • -u:仅添加新文件或修改过的文件到归档文件中。

解压归档文件:

  • -x:从归档文件中提取文件。
  • -t:查看归档文件的内容列表。

归档类型:

  • -z:使用 gzip 压缩归档文件(通常与 -c-x 一起使用,用于创建或解压缩 .tar.gz.tgz 文件)。
  • -j:使用 bzip2 压缩归档文件(通常与 -c-x 一起使用,用于创建或解压缩 .tar.bz2.tbz2 文件)。
  • -J:使用 xz 压缩归档文件(通常与 -c-x 一起使用,用于创建或解压缩 .tar.xz.txz 文件)。

归档选项:

  • -v:详细输出,显示正在处理的文件。
  • -C:切换到指定目录并执行操作。例如,-C /path/to/directory 将在指定目录中创建或提取文件。
  • --strip-components:在提取文件时去除路径。例如,--strip-components=1 将从归档中去除顶层目录。

其他选项:

  • -A:将多个归档文件追加到一个现有的归档文件。
  • --delete:从归档文件中删除文件。
  • --list:列出归档文件的内容。
  • --wildcards:支持通配符模式匹配文件。

find命令

该命令的目的是在整个文件系统中查找除了属于"root"、"bin"和"net"用户之外的所有文件和目录,并以长格式(详细列表)显示它们。同时,任何错误消息将被重定向到/dev/null设备,即不显示错误消息。

bash
find / ! -user root -and ! -user bin -and ! -user net -exec ls -l {} \; 2> /dev/null
  • find /:从根目录开始递归搜索。
  • ! -user root:排除属于"root"用户的文件和目录。
  • -and ! -user bin:同时排除属于"bin"用户的文件和目录。
  • -and ! -user net:同时排除属于"net"用户的文件和目录。
  • -exec ls -l {} \;:对每个找到的文件和目录执行ls -l命令,以长格式显示它们。
  • 2> /dev/null:将标准错误(stderr)重定向到/dev/null,即丢弃错误消息。

find命令中,-exec选项后面跟着要执行的命令。{} 是一个占位符,表示find命令找到的每个文件或目录的路径将替换它。\; 是用来标记-exec选项的结束。

在Linux和类Unix系统中,每个进程都有三个标准文件描述符:标准输入(stdin,文件描述符0),标准输出(stdout,文件描述符1)和标准错误(stderr,文件描述符2)。它们分别用于输入数据、输出数据和错误消息。

2> /dev/null 中的 2 表示标准错误的文件描述符。> 是输出重定向操作符,它将标准错误的输出重定向到指定的文件或设备。

find命令还支持其他类型的文件匹配。下面是一些常见的-type选项及其对应的文件类型:

  • -type d:目录(directory)。

  • -type f:文件(file)。

  • -type l:符号链接(symbolic link)。

  • -type c:字符设备文件(character device)。

  • -type b:块设备文件(block device)。

  • -type s:套接字文件(socket)。

  • -type p:命名管道(named pipe)。

    grep

    以下是 grep 命令的基本语法:

    bash
    bashCopy code
    grep [选项] 模式 [文件...]
    • 选项:可以是多个选项,用来控制 grep 的行为。
    • 模式:是要搜索的文本模式,可以是普通字符串或正则表达式。
    • 文件:是要在其中搜索模式的文件列表。如果未提供文件列表,则 grep 将从标准输入中读取数据。

    一些常用的 grep 选项包括:

    • -i:忽略大小写,使搜索不区分大小写。
    • -r-R:递归地搜索目录中的文件。
    • -v:反转匹配,只显示不匹配模式的行。
    • -l:只显示包含匹配模式的文件名,而不显示匹配的行。
    • -n:显示匹配行的行号。
    • -c:仅显示匹配模式的行数,而不显示匹配的行。

    一些示例用法:

    1. 在文件中搜索特定文本模式:

      bash
      bashCopy code
      grep "pattern" filename
    2. 递归地搜索目录中的文件:

      bash
      bashCopy code
      grep -r "pattern" directory
    3. 忽略大小写搜索:

      bash
      bashCopy code
      grep -i "pattern" filename
    4. 显示匹配行的行号:

      bash
      bashCopy code
      grep -n "pattern" filename
    5. 反转匹配,显示不包含模式的行:

      bash
      bashCopy code
      grep -v "pattern" filename
    6. 统计匹配行的数量:

      bash
      bashCopy code
      grep -c "pattern" filename

    apt

    aptapt-get 是用于在Debian和基于Debian的Linux发行版上安装、更新和管理软件包的命令行工具。它们有一些区别,主要是在用户界面和功能方面。

    1. 用户界面
      • apt 是一个相对新的工具,被设计成更加用户友好。它的输出更为清晰,提供了更多易读的信息,并使用彩色高亮显示,使用户更容易理解正在执行的操作。
      • apt-get 是一个传统的、较早的工具,其输出相对较少,不太容易理解,通常需要用户熟悉命令的工作方式。
    2. 自动选项
      • apt 默认启用了一些自动选项,如自动确认安装、卸载和更新操作。这意味着在许多情况下,你无需手动确认操作。
      • apt-get 需要用户手动添加 -y 选项来实现类似的自动确认操作。如果不使用 -y,它会提示用户确认操作。
    3. 更多功能
      • apt 试图汇总 apt-getapt-cacheapt-config 和其他APT工具的功能,以提供一个更一体化的包管理解决方案。这意味着你可以使用 apt 进行更多不同类型的操作,而不仅仅是安装和升级软件包。
      • apt-get 更专注于软件包管理,它的主要目的是在命令行中提供精确的包管理功能,如安装、升级和卸载软件包。

    apt-cache

    apt-cache 是一个用于查询软件包缓存信息的命令行工具。APT 是用于管理软件包的包管理工具,而 apt-cache 可以帮助你获取关于可用软件包的各种信息,如软件包的描述、依赖关系、版本信息等。软件包缓存信息通常保存在本地系统上。以便加快软件包管理操作的速度,减少需要从远程存储库下载信息的频率。这个本地存储通常位于 /var/cache/apt 目录下。

    以下是一些常用的 apt-cache 子命令和用法:

  1. 搜索软件包

    bash
    apt-cache search package_name

    用于搜索与指定名称或关键字匹配的软件包。它会列出所有包含匹配文本的软件包名称和描述。

  2. 清理软件包缓存

    bash
    sudo apt-get clean

    清理本地软件包缓存,删除已下载的软件包文件,以节省磁盘空间。

xargs

xargs 是一个用于从标准输入中读取数据并将其作为参数传递给其他命令的实用程序。它通常用于构建和执行一系列命令,特别是在处理大量文件或数据时非常有用。xargs 可以将输入数据分割成适当大小的块,并将每个块作为参数传递给指定的命令。

以下是 xargs 命令的一般语法:

bash
command | xargs [options] [command]
  • command:是要运行的命令,通常是一个可执行文件或shell命令。
  • options:是用于控制 xargs 行为的选项。
  • command:是可选的,如果指定了 command,则 xargs 将使用它作为要执行的命令。如果未指定 command,则默认为 echo,它将输出输入数据。

一些常见的 xargs 选项和用法:

  1. -I 替代字符串:使用 -I 选项可以指定一个替代字符串,它将被 xargs 用输入数据替换,然后传递给命令。例如:

    bash
    echo "file1 file2 file3" | xargs -I {} mv {} /destination

Makefile

自动变量

Make命令还提供一些自动变量,它们的值与当前规则有关。主要有以下几个。

(1)$@

$@指代当前目标,就是Make命令当前构建的那个目标。比如,make foo的 $@ 就指代foo。

bash
a.txt b.txt: 
    touch $@

等同于下面的写法。

bash
a.txt:
    touch a.txt
b.txt:
    touch b.txt

(2)$<

$< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。

bash
a.txt: b.txt c.txt
    cp $< $@

等同于下面的写法。

bash
a.txt: b.txt c.txt
    cp b.txt a.txt

(3)$?

$? 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。

(4)$^

$^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。

(5)$*

$* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。

(6)$(@D) 和 $(@F)

$(@D) 和 $(@F) 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。

(7)$(<D) 和 $(<F)

$(<D) 和 $(<F) 分别指向 $< 的目录名和文件名。

所有的自动变量清单,请看手册。下面是自动变量的一个例子。

bash
dest/%.txt: src/%.txt
    @[ -d dest ] || mkdir dest
    cp $< $@

上面代码将 src 目录下的 txt 文件,拷贝到 dest 目录下。首先判断 dest 目录是否存在,如果不存在就新建,然后,$< 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。

常用命令

替换后缀名

替换后缀名函数的写法是:变量名 + 冒号 + 后缀名替换规则。它实际上patsubst函数的一种简写形式。

bash
min: $(OUTPUT:.js=.min.js)

上面代码的意思是,将变量OUTPUT中的后缀名 .js 全部替换成 .min.js 。

生成.o文件

bash
OBJECTS = $(SOURCES:.c=.o)

生成可执行程序

bash
$(TARGET): $(OBJECTS)
 $(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET)

编译源文件为目标文件

bash
%.o: %.c $(HEADERS)
 $(CC) $(CFLAGS) -c $< -o $@

清理中间文件和目标程序

bash
clean:
 rm -f $(OBJECTS) $(TARGET)

生成的目标文件

bash
OBJECTS = $(SOURCES:.c=.o)

实例

执行多个目标

bash
.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
        rm program

cleanobj :
        rm *.o

cleandiff :
        rm *.diff

上面代码可以调用不同目标,删除不同后缀名的文件,也可以调用一个目标(cleanall),删除所有指定类型的文件。

(2)编译C语言项目

bash
edit : main.o kbd.o command.o display.o 
    cc -o edit main.o kbd.o command.o display.o

main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h
    cc -c display.c

clean :
     rm edit main.o kbd.o command.o display.o

.PHONY: edit clean

驱动模块安装

安装CH340驱动

查看ubuntu系统自带的驱动

bash
ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial

移除旧版系统自带版本

bash
rm -rf ch341.ko

下载驱动 https://www.wch.cn/download/CH341SER_LINUX_ZIP.html

cd 切换至下载的文件夹,make编译源码,生成ch341.ko文件

安装模块

bash
sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/

手动临时加载模块

bash
insmod ch341.ko

永久性加载模块

bash
echo "ch341" | sudo tee -a /etc/modules

输入lsmod命令查看是否加载成功。

/etc/modules 文件

/etc/modules 文件通常用于在Linux系统中指定需要在启动时加载的内核模块。内核模块是Linux内核的可加载部分,它们可以提供额外的驱动程序或功能,以支持硬件设备或添加特定的功能。/etc/modules 文件允许管理员列出要在系统引导时自动加载的内核模块,而不必手动运行modprobeinsmod命令。

在大多数Linux系统中,默认情况下,内核模块文件通常存储在/lib/modules目录下。这个目录通常包含与系统中安装的内核版本相关的子目录,每个子目录都对应一个特定的内核版本。每个子目录中包含了该内核版本所需的所有内核模块文件。

通常,您可以在/lib/modules目录下找到类似于以下的子目录结构:

bash
 /lib/modules/
    ├── 5.4.0-88-generic/
    ├── 5.10.0-10-amd64/
    ├── ...

每个子目录的名称都表示一个具体的内核版本,例如5.4.0-88-generic5.10.0-10-amd64。内核模块文件通常存储在这些内核版本的子目录中,按照模块名称进行组织。例如,/lib/modules/5.4.0-88-generic/目录下可能包含名为module1.komodule2.ko等的内核模块文件。

Released under the MIT License.