目录
/
: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
:用户级的源码目录。
常用命令
查看已安装程序
dpkg --list
删除程序
sudo apt-get remove dante-server && sudo apt-get autoremove
nohup
nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入,所以说添加 & ( 表示“and”的符号)到命令的尾部。
nohup java -jar shop-admin-s.jar &
nohup.out的查看日志方法
// 实时查看
tail -f nohup.out
// 查看最后1000行日志文本
tail -1000 nohup.out
nohup.out文件过大
nohup.out会一直一直自己增长下去,因此就有了我们不停止服务直接,清空nohup.out文件的方法。 两个可以不用停止WEB服务就可以清空nohup.out的命令。
// 第一种 :/dev/nul把它丢弃一切写入其中的数据 意思就是把空的复制粘贴 给nohup.out
cp /dev/null nohup.out
// 第二种: 把无底洞定向输出到 nohup.out 起到清空作用
cat /dev/null > nohup.out
输入输出重定向
在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中
nohup java -jar shop-admin-s.jar &
####将标准错误输出重定向到标准输出到当前目录下叫log的文件
注意不能写反 >log 一定要写在前面 : 意思是1指向log文件,2 指向1,所以2也指向log满足输出到log。
如果是错误写法,则为2指向1,又因为1默认指向屏幕 ,所以2指向屏幕,然后 >log 造成1重新指向log
// 标准错误输出和标准输出都定向到log中
nohup java -jar shop-admin-s.jar >log 2>&1 &
// 简写
nohup java -jar shop-admin-s.jar &>log &
什么信息也不要
nohup java -jar shop-admin-s.jar >/dev/null 2>&1 &
只输出错误信息
nohup java -jar shop-admin-s.jar >/dev/null 2>log &
关于/dev/null文件
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
Docker 常用命令
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 网络模式
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 网络模式直接使用宿主机的网络,没有网络隔离,不需要考虑容器端口的映射,在容器启动后可以自由调整被占用的端口。适合在本机使用 (localhost),或者直通外网的设备对外开放服务,就比如 VPS 、主路由。
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 的提示,需要手动处理,方法如下:
#停止 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
在编辑器中粘贴以下内容:
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
保存后执行以下命令。
#创建备份
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”调出来,基本能够解决你的绝大多数问题。
使用Gost搭建一个快速简单的Socks5代理通道
常规安装 AMD64
框架机型
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
文件可修改配置数据 如果使用宝塔面板需要在面板放行设置的端口
查看文件大小
du -h –max-depth=1 *
设置时区
修改设置Linux服务器时区
方法 A
命令 : "tzselect"
composer安装插件时无法连接或者无反应
原因: 可能的原因是 composer 的安装包网址是国外镜像所致,被长城防火墙屏蔽了。可执行以下命令来解决:
- 修改为国内镜像。可选择以下任一镜像源进行配置:
Packagist 中国全量镜像
bashcomposer config -g repo.packagist composer https://packagist.phpcomposer.com
阿里云镜像
bashcomposer 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 > file3 | file和file2文件内容,输出到新文件file3中 |
rm filename | 删除文件 |
sudo nautilus | 管理员身份启动任务管理器 |
cd | 进入主 home 目录 |
cd /上级目录名称 | 回到上级目录 |
cd .. | 回到上级目录 |
pwd | 显示当前所在的目录 |
mkdir | 创建一个新的目录 |
mkdir {test1,test2}或 test1 test2 | 创建多个新的目录 |
rm | 删除文件或目录 |
cp | 复制文件 |
cp -a test testbak | 复制目录 test 到 testbak 目录,更全面 |
cp -r test testbak | 复制目录 test 到 testbak 目录 |
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 | 更改文件或目录的所有者 |
详解
硬连接和软连接
硬连接(Hard Link):
- 硬连接是文件系统中的一个概念,它允许一个文件拥有多个硬连接。
- 所有硬连接都指向同一个物理数据块,因此它们共享相同的数据内容。
- 删除一个硬连接并不会影响其他硬连接,只有当所有硬连接都被删除后,文件的数据块才会被释放。
- 硬连接不能跨越文件系统边界,它们必须位于同一个文件系统中。
- 硬连接没有关联的文件路径,只有一个inode,因此它们不能指向目录。
软连接(Symbolic Link):
- 软连接是一个特殊类型的文件,其中包含了指向另一个文件或目录的路径。
- 软连接不拥有自己的数据内容,它只是一个指向其他文件或目录的符号。
- 删除原始文件或目录不会立即删除软连接,软连接会变为“悬空”,即指向不存在的路径。
- 软连接可以跨越文件系统边界,因为它们只存储路径信息。
- 软连接可以指向目录,也可以指向文件。
当硬链接的源文件被删除时,硬链接本身仍然可以访问相同的数据内容,因为硬链接与原始文件共享相同的inode和数据块。删除原始文件只会减少硬链接计数,而不会影响硬链接本身。
硬链接的工作方式是通过inode来实现的。每个文件(包括硬链接和原始文件)都有一个唯一的inode号码,inode包含文件的元数据和数据块的位置。当你创建一个硬链接时,它实际上是另一个指向相同inode的入口点,所以硬链接和原始文件都指向相同的数据块。硬链接的计数会增加1,表示有多个入口点指向inode。
less 查看文本文件内容
查看文本文件:要查看文本文件,只需在终端中输入
less
命令,后跟文件名,如下所示:bashless filename.txt
向下滚动文本:按下键盘的 空格键(空格)或 Page Down 键来向下滚动一页。
向上滚动文本:按下键盘的 Page Up 键或 b 来向上滚动一页。
向前滚动一行:按下 向下箭头键 或 j 键。
向后滚动一行:按下 向上箭头键 或 k 键。
退出
less
:按下 q 键,以退出less
并返回到终端提示符。搜索文本:按下 / 键,然后输入你要搜索的文本,按下回车键。
less
会高亮显示匹配的文本,并显示匹配的位置,按下 n 键来查找下一个匹配项,按下 N 键来查找上一个匹配项。退出搜索:按下 Esc 键。
前往指定行数:按下 : 键,然后输入要跳转到的行数,按下回车键。
按 v 进入编辑模式,按ctrl X 退出编辑。
tar
tar
命令用于创建、查看和提取归档文件,通常用于打包和压缩文件和目录。tar
命令的参数和选项有很多,下面是一些常见的参数和选项的详细解释:
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
设备,即不显示错误消息。
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
命令的基本语法:bashbashCopy code grep [选项] 模式 [文件...]
选项
:可以是多个选项,用来控制grep
的行为。模式
:是要搜索的文本模式,可以是普通字符串或正则表达式。文件
:是要在其中搜索模式的文件列表。如果未提供文件列表,则grep
将从标准输入中读取数据。
一些常用的
grep
选项包括:-i
:忽略大小写,使搜索不区分大小写。-r
或-R
:递归地搜索目录中的文件。-v
:反转匹配,只显示不匹配模式的行。-l
:只显示包含匹配模式的文件名,而不显示匹配的行。-n
:显示匹配行的行号。-c
:仅显示匹配模式的行数,而不显示匹配的行。
一些示例用法:
在文件中搜索特定文本模式:
bashbashCopy code grep "pattern" filename
递归地搜索目录中的文件:
bashbashCopy code grep -r "pattern" directory
忽略大小写搜索:
bashbashCopy code grep -i "pattern" filename
显示匹配行的行号:
bashbashCopy code grep -n "pattern" filename
反转匹配,显示不包含模式的行:
bashbashCopy code grep -v "pattern" filename
统计匹配行的数量:
bashbashCopy code grep -c "pattern" filename
apt
apt
和apt-get
是用于在Debian和基于Debian的Linux发行版上安装、更新和管理软件包的命令行工具。它们有一些区别,主要是在用户界面和功能方面。- 用户界面:
apt
是一个相对新的工具,被设计成更加用户友好。它的输出更为清晰,提供了更多易读的信息,并使用彩色高亮显示,使用户更容易理解正在执行的操作。apt-get
是一个传统的、较早的工具,其输出相对较少,不太容易理解,通常需要用户熟悉命令的工作方式。
- 自动选项:
apt
默认启用了一些自动选项,如自动确认安装、卸载和更新操作。这意味着在许多情况下,你无需手动确认操作。apt-get
需要用户手动添加-y
选项来实现类似的自动确认操作。如果不使用-y
,它会提示用户确认操作。
- 更多功能:
apt
试图汇总apt-get
、apt-cache
、apt-config
和其他APT工具的功能,以提供一个更一体化的包管理解决方案。这意味着你可以使用apt
进行更多不同类型的操作,而不仅仅是安装和升级软件包。apt-get
更专注于软件包管理,它的主要目的是在命令行中提供精确的包管理功能,如安装、升级和卸载软件包。
apt-cache
apt-cache
是一个用于查询软件包缓存信息的命令行工具。APT 是用于管理软件包的包管理工具,而apt-cache
可以帮助你获取关于可用软件包的各种信息,如软件包的描述、依赖关系、版本信息等。软件包缓存信息通常保存在本地系统上。以便加快软件包管理操作的速度,减少需要从远程存储库下载信息的频率。这个本地存储通常位于/var/cache/apt
目录下。以下是一些常用的
apt-cache
子命令和用法:
搜索软件包:
bashapt-cache search package_name
用于搜索与指定名称或关键字匹配的软件包。它会列出所有包含匹配文本的软件包名称和描述。
清理软件包缓存:
bashsudo apt-get clean
清理本地软件包缓存,删除已下载的软件包文件,以节省磁盘空间。
xargs
xargs
是一个用于从标准输入中读取数据并将其作为参数传递给其他命令的实用程序。它通常用于构建和执行一系列命令,特别是在处理大量文件或数据时非常有用。xargs
可以将输入数据分割成适当大小的块,并将每个块作为参数传递给指定的命令。
以下是 xargs
命令的一般语法:
command | xargs [options] [command]
command
:是要运行的命令,通常是一个可执行文件或shell命令。options
:是用于控制xargs
行为的选项。command
:是可选的,如果指定了command
,则xargs
将使用它作为要执行的命令。如果未指定command
,则默认为echo
,它将输出输入数据。
一些常见的 xargs
选项和用法:
-I 替代字符串:使用
-I
选项可以指定一个替代字符串,它将被xargs
用输入数据替换,然后传递给命令。例如:bashecho "file1 file2 file3" | xargs -I {} mv {} /destination
Makefile
自动变量
Make命令还提供一些自动变量,它们的值与当前规则有关。主要有以下几个。
(1)$@
$@指代当前目标,就是Make命令当前构建的那个目标。比如,make foo
的 $@ 就指代foo。
a.txt b.txt:
touch $@
等同于下面的写法。
a.txt:
touch a.txt
b.txt:
touch b.txt
(2)$<
$< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。
a.txt: b.txt c.txt
cp $< $@
等同于下面的写法。
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) 分别指向 $< 的目录名和文件名。
所有的自动变量清单,请看手册。下面是自动变量的一个例子。
dest/%.txt: src/%.txt
@[ -d dest ] || mkdir dest
cp $< $@
上面代码将 src 目录下的 txt 文件,拷贝到 dest 目录下。首先判断 dest 目录是否存在,如果不存在就新建,然后,$< 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。
常用命令
替换后缀名
替换后缀名函数的写法是:变量名 + 冒号 + 后缀名替换规则。它实际上patsubst函数的一种简写形式。
bashmin: $(OUTPUT:.js=.min.js)
上面代码的意思是,将变量OUTPUT中的后缀名 .js 全部替换成 .min.js 。
生成.o文件
OBJECTS = $(SOURCES:.c=.o)
生成可执行程序
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET)
编译源文件为目标文件
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
清理中间文件和目标程序
clean:
rm -f $(OBJECTS) $(TARGET)
生成的目标文件
OBJECTS = $(SOURCES:.c=.o)
实例
执行多个目标
bash.PHONY: cleanall cleanobj cleandiff cleanall : cleanobj cleandiff rm program cleanobj : rm *.o cleandiff : rm *.diff
上面代码可以调用不同目标,删除不同后缀名的文件,也可以调用一个目标(cleanall),删除所有指定类型的文件。
(2)编译C语言项目
bashedit : 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系统自带的驱动
ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial
移除旧版系统自带版本
rm -rf ch341.ko
下载驱动 https://www.wch.cn/download/CH341SER_LINUX_ZIP.html
cd 切换至下载的文件夹,make编译源码,生成ch341.ko文件
安装模块
sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/
手动临时加载模块
insmod ch341.ko
永久性加载模块
echo "ch341" | sudo tee -a /etc/modules
输入lsmod命令查看是否加载成功。
/etc/modules 文件
/etc/modules
文件通常用于在Linux系统中指定需要在启动时加载的内核模块。内核模块是Linux内核的可加载部分,它们可以提供额外的驱动程序或功能,以支持硬件设备或添加特定的功能。/etc/modules
文件允许管理员列出要在系统引导时自动加载的内核模块,而不必手动运行modprobe
或insmod
命令。
在大多数Linux系统中,默认情况下,内核模块文件通常存储在/lib/modules
目录下。这个目录通常包含与系统中安装的内核版本相关的子目录,每个子目录都对应一个特定的内核版本。每个子目录中包含了该内核版本所需的所有内核模块文件。
通常,您可以在/lib/modules
目录下找到类似于以下的子目录结构:
/lib/modules/
├── 5.4.0-88-generic/
├── 5.10.0-10-amd64/
├── ...
每个子目录的名称都表示一个具体的内核版本,例如5.4.0-88-generic
和5.10.0-10-amd64
。内核模块文件通常存储在这些内核版本的子目录中,按照模块名称进行组织。例如,/lib/modules/5.4.0-88-generic/
目录下可能包含名为module1.ko
、module2.ko
等的内核模块文件。