Linux扩展
目录
扩展
查找如何进行后台运行程序的指令
使用 & 符号
使用 nohup 命令
使用 screen 或 tmux
find命令
基本语法
常用选项
grep 命令
基本语法
常用选项
如何使用 vim 直接定位到错误行
1. 使用 :make 和 :copen
2. 使用 :lineno 定位
3. 通过 :grep 或 :vimgrep
4. 错误标记和高亮
5. 自动跳转(插件)
6.进入到 vim 后,:行号
7. vim 文件名 +行号
使用/字符串查找完之后,如何取消高亮
利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件
gdb 主函数传参 3 种方式
(1) 在命令行中传递参数
(2) 使用 set args 命令传递参数
(3) 在程序启动时通过环境变量传递
如何在 makefile 文件中做 echo 提示且不显示执行指令
SOURCES := $(wildcard $(patsubst %,%/*.c, $(SOURCEDIRS)))
1. $(SOURCEDIRS)
2. $(patsubst %,%/*.c, $(SOURCEDIRS))
3. $(wildcard ...)
4. 综合结果
5.举例
lstat 判断文件权限用的宏
1. lstat 函数
2. st_mode 字段和文件权限
3. 判断文件权限的宏
4. 示例代码:如何使用 lstat 判断文件权限
5. 解释
6. 结果示例
glob()
扩展
查找如何进行后台运行程序的指令
在 Linux 或 Unix 系统中,可以通过以下几种方式让程序在后台运行:
使用 & 符号
-
语法:
command & -
说明:在命令后面加上
&,可以让程序在后台运行。例如:sleep 100 &这会启动一个
sleep命令,让它在后台运行100秒。
使用 nohup 命令
-
语法:
nohup command & -
说明:
nohup是一个用于在用户注销后继续运行命令的工具。它会将程序的输出重定向到nohup.out文件中。例如:nohup python myscript.py &这会运行一个 Python 脚本,并将其输出保存到
nohup.out文件中,同时让程序在后台运行。
使用 screen 或 tmux
-
screen-
启动:
screen -S session_name(创建一个名为session_name的会话) -
进入后台:在
screen会话中按Ctrl+A,然后按D键,会话会进入后台。 -
重新连接:
screen -r session_name(重新连接到后台的会话)
-
-
tmux-
启动:
tmux new -s session_name(创建一个名为session_name的会话) -
进入后台:在
tmux会话中按Ctrl+B,然后按D键,会话会进入后台。 -
重新连接:
tmux attach -t session_name(重新连接到后台的会话)
-
find命令
find 是一个强大的命令行工具,用于在文件系统中查找文件和目录。
基本语法
find [路径] [选项] [表达式]
常用选项
-
-name:按文件名查找find . -name "*.txt" # 查找当前目录及其子目录下所有扩展名为.txt的文件 -
-type:按文件类型查找-
f:普通文件 -
d:目录 -
l:链接
find . -type d -name "bin" # 查找当前目录及其子目录下所有名为bin的目录 -
-
-mtime:按修改时间查找find . -mtime +7 # 查找7天前修改的文件 -
-size:按文件大小查找find . -size +10M # 查找大于10MB的文件
grep 命令
grep 是一个用于搜索文本内容的工具,可以在文件中查找匹配特定模式的行。
基本语法
grep [选项] 模式 文件
常用选项
-
-i:忽略大小写grep -i "hello" file.txt # 在file.txt中查找包含"hello"的行,忽略大小写 -
-r或-R:递归搜索grep -r "hello" . # 在当前目录及其子目录中递归查找包含"hello"的行 -
-v:反向匹配grep -v "hello" file.txt # 在file.txt中查找不包含"hello"的行 -
-n:显示行号grep -n "hello" file.txt # 在file.txt中查找包含"hello"的行,并显示行号 -
-w:匹配整词grep -w "hello" file.txt # 在file.txt中查找整词"hello"的行
如何使用 vim 直接定位到错误行
1. 使用 :make 和 :copen
如果你在 Vim 中编译代码并且遇到错误,通常你会使用 :make 命令来进行编译。编译过程中,Vim 会生成一个错误列表,通常显示在 quickfix 窗口中。你可以通过以下步骤直接定位到错误行:
- 运行编译命令:例如
:make,它会调用你配置的编译器(如gcc)进行编译,错误信息会被捕捉到 quickfix 列表中。 - 打开 quickfix 窗口:运行
:copen,这会打开一个窗口,显示所有编译错误。 - 跳转到特定错误:在 quickfix 窗口中,使用
:cnext跳转到下一个错误,使用:cprev跳转到上一个错误,或者使用:cc <number>跳转到指定的错误。
2. 使用 :lineno 定位
如果你已经知道错误所在的行号,你可以使用 :linenumber 直接跳转到该行。例如:
:15
这将会跳转到第 15 行。
3. 通过 :grep 或 :vimgrep
如果你要查找某个关键字或错误信息,可以使用 :grep 或 :vimgrep 来搜索并定位到相关行。例如:
:vimgrep /error/ *.c
这会在当前目录下的所有 .c 文件中搜索包含 "error" 的行,然后你可以通过 :copen 查看错误列表并跳转。
4. 错误标记和高亮
当你打开代码后,你可以使用 :set errorformat 配置错误格式,以便能够更好地解析编译器输出的错误信息。
5. 自动跳转(插件)
如果你经常需要定位错误行,也可以使用一些插件,比如 Ale 或 Syntastic,这些插件会自动扫描文件并在你编写代码时实时显示错误信息,你只需按下快捷键(如 ]e 或 [e)即可直接跳转到错误行。
6.进入到 vim 后,:行号
7. vim 文件名 +行号
使用/字符串查找完之后,如何取消高亮
:noh
利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件
可以使用 find 命令来查找目录下的文件,然后使用 grep 来查找包含指定字符串的文件。组合命令如下:
find /path/to/dir -type f -exec grep -l "search_string" {} \;
/path/to/dir:你要查找的目录。-type f:仅查找文件。-exec grep -l "search_string" {} \;:对于每个找到的文件,执行grep命令查找包含search_string的文件,并且-l选项使得grep输出匹配该字符串的文件名。
这将列出所有包含指定字符串的文件。
如果你想让 grep 支持递归查找文件,可以直接使用 grep 的 -r 选项来查找:
grep -rl "search_string" /path/to/dir
gdb 主函数传参 3 种方式
(1) 在命令行中传递参数
可以在启动 GDB 时通过 --args 参数传递命令行参数:
gdb --args ./your_program arg1 arg2 arg3
然后,使用 run 命令启动调试,会将 arg1, arg2, arg3 传递给主函数。
(2) 使用 set args 命令传递参数
在 GDB 会话中,可以通过 set args 命令设置主函数的命令行参数:
(gdb) set args arg1 arg2 arg3
(gdb) run
这将把 arg1, arg2, arg3 作为参数传递给主函数。
(3) 在程序启动时通过环境变量传递
通过环境变量传递参数也是一种方式,虽然不常见,但可以在某些情况下使用。在 GDB 中,可以使用 set environment 命令来设置环境变量:
(gdb) set environment VAR=value
但要注意,主函数的 argc 和 argv 是通过命令行参数传递的,环境变量方式一般用于设置特定的程序行为。
如何在 makefile 文件中做 echo 提示且不显示执行指令
在 Makefile 中,想要做一个 echo 提示,但不显示执行指令,你可以使用 @ 符号来禁止显示当前命令。示例如下:
all:@echo "This is a message without showing the command"
@符号可以让make在执行时不显示该命令本身,只显示echo输出的内容。
如果你不加 @,make 会显示执行的命令行:
all:echo "This is a message with the command visible"
这样会在终端显示 echo 命令以及其输出。
SOURCES := $(wildcard $(patsubst %,%/*.c, $(SOURCEDIRS)))
这行代码使用了 Makefile 中的 wildcard 函数和 patsubst 函数,来动态获取文件路径。具体来说,它的作用是根据给定的 SOURCEDIRS 变量中的目录列表,查找这些目录下的所有 .c 文件,并将这些文件的路径存储到 SOURCES 变量中。
逐步分析这个表达式:
SOURCES := $(wildcard $(patsubst %,%/*.c, $(SOURCEDIRS)))
1. $(SOURCEDIRS)
SOURCEDIRS 是一个包含目录路径的变量,可能是类似这样的列表:
SOURCEDIRS := src lib
这个变量包含了多个目录路径(比如 src 和 lib)。
2. $(patsubst %,%/*.c, $(SOURCEDIRS))
patsubst 是 Makefile 中的一个函数,用于模式替换。它的语法是:
$(patsubst pattern,replacement,text)
它会将 text 中所有匹配 pattern 的部分替换为 replacement。
pattern:匹配的模式,这里是%,代表任意字符串。replacement:替换成的内容,这里是/%/*.c,表示每个目录后面加上/*.c,以匹配该目录下的.c文件。text:要进行替换的字符串,这里是$(SOURCEDIRS),即包含目录路径的列表。
举个例子,如果 SOURCEDIRS 包含 src 和 lib,那么:
$(patsubst %,%/*.c, $(SOURCEDIRS))
会将 src 替换为 src/*.c,将 lib 替换为 lib/*.c,最终结果是:
src/*.c lib/*.c
这表示 src 和 lib 目录下的所有 .c 文件。
3. $(wildcard ...)
wildcard 是 Makefile 中的一个函数,用于匹配文件名。它接受一个模式字符串并返回匹配该模式的所有文件路径。假设有如下目录结构:
src/file1.cfile2.c
lib/file3.c
执行:
$(wildcard src/*.c lib/*.c)
将返回:
src/file1.c src/file2.c lib/file3.c
4. 综合结果
首先,$(patsubst %,%/*.c, $(SOURCEDIRS)) 将 SOURCEDIRS 中的每个目录替换成该目录下的所有 .c 文件(比如 src/*.c lib/*.c)。然后,wildcard 函数会列出这些目录下所有匹配 .c 文件的实际路径。最终,SOURCES 变量将包含所有 .c 文件的路径。
5.举例
假设 SOURCEDIRS 如下:
SOURCEDIRS := src lib
且目录结构为:
src/file1.cfile2.c
lib/file3.c
那么,执行后的结果是:
SOURCES := src/file1.c src/file2.c lib/file3.c
SOURCES 变量将包含这三个 .c 文件的路径。
lstat 判断文件权限用的宏
在 lstat 中判断文件权限通常涉及到使用文件的 mode(权限掩码)。通过 lstat 获取文件的属性后,可以通过位运算和相应的宏来判断文件的权限。
在 Linux 中,文件权限包括读、写、执行权限,分别对应 Owner(文件拥有者)、Group(文件所属组)和 Others(其他用户)权限。这些权限在 struct stat 结构体中的 st_mode 字段内。
1. lstat 函数
lstat 是用于获取文件或符号链接的状态信息的系统调用。其原型如下:
#include <sys/stat.h>int lstat(const char *pathname, struct stat *statbuf);
调用 lstat 后,你会得到一个 struct stat 结构体,其中的 st_mode 字段保存了文件的模式(即文件权限)。
2. st_mode 字段和文件权限
st_mode 字段是一个位掩码,包含了文件的类型和权限信息。通过一些宏,你可以解析出不同类型的权限。
3. 判断文件权限的宏
以下是一些常见的宏,它们可以用来从 st_mode 中提取文件权限:
S_ISDIR(st_mode):判断是否为目录。S_ISREG(st_mode):判断是否为常规文件。S_ISLNK(st_mode):判断是否为符号链接。S_ISCHR(st_mode):判断是否为字符设备文件。S_ISBLK(st_mode):判断是否为块设备文件。S_ISFIFO(st_mode):判断是否为 FIFO 文件(命名管道)。S_ISSOCK(st_mode):判断是否为套接字。
关于权限的宏:
S_IRUSR:用户读取权限(Owner read)。S_IWUSR:用户写入权限(Owner write)。S_IXUSR:用户执行权限(Owner execute)。S_IRGRP:组读取权限(Group read)。S_IWGRP:组写入权限(Group write)。S_IXGRP:组执行权限(Group execute)。S_IROTH:其他用户读取权限(Others read)。S_IWOTH:其他用户写入权限(Others write)。S_IXOTH:其他用户执行权限(Others execute)。
4. 示例代码:如何使用 lstat 判断文件权限
以下是一个示例,展示如何使用 lstat 和上述宏判断文件的权限:
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>void check_permissions(const char *path) {struct stat st;if (lstat(path, &st) == -1) {perror("lstat");return;}printf("File: %s\n", path);// 检查文件类型if (S_ISDIR(st.st_mode)) {printf("It is a directory.\n");} else if (S_ISREG(st.st_mode)) {printf("It is a regular file.\n");} else if (S_ISLNK(st.st_mode)) {printf("It is a symbolic link.\n");} else {printf("Unknown file type.\n");}// 检查文件权限if (st.st_mode & S_IRUSR) printf("Owner has read permission.\n");if (st.st_mode & S_IWUSR) printf("Owner has write permission.\n");if (st.st_mode & S_IXUSR) printf("Owner has execute permission.\n");if (st.st_mode & S_IRGRP) printf("Group has read permission.\n");if (st.st_mode & S_IWGRP) printf("Group has write permission.\n");if (st.st_mode & S_IXGRP) printf("Group has execute permission.\n");if (st.st_mode & S_IROTH) printf("Others have read permission.\n");if (st.st_mode & S_IWOTH) printf("Others have write permission.\n");if (st.st_mode & S_IXOTH) printf("Others have execute permission.\n");
}int main() {const char *file_path = "testfile"; // 替换为你的文件路径check_permissions(file_path);return 0;
}
5. 解释
lstat(path, &st):获取文件状态信息,并将结果存储在st中。S_ISDIR(st.st_mode)等宏用于检查文件的类型。- 权限是通过位掩码来检查的,例如,
st.st_mode & S_IRUSR会判断是否设置了用户的读取权限。
6. 结果示例
假设文件 testfile 拥有如下权限:-rwxr-xr--(即用户有读、写、执行权限,组有读、执行权限,其他用户只有读取权限)。执行上述程序,输出可能如下:
File: testfile
It is a regular file.
Owner has read permission.
Owner has write permission.
Owner has execute permission.
Group has read permission.
Group has execute permission.
Others have read permission.
glob()
glob函数的使用 - dolinux - 博客园
