当前位置: 首页 > news >正文

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 文件中,同时让程序在后台运行。

使用 screentmux

  • 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 窗口中。你可以通过以下步骤直接定位到错误行:

  1. 运行编译命令:例如 :make,它会调用你配置的编译器(如 gcc)进行编译,错误信息会被捕捉到 quickfix 列表中。
  2. 打开 quickfix 窗口:运行 :copen,这会打开一个窗口,显示所有编译错误。
  3. 跳转到特定错误:在 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. 自动跳转(插件)

如果你经常需要定位错误行,也可以使用一些插件,比如 AleSyntastic,这些插件会自动扫描文件并在你编写代码时实时显示错误信息,你只需按下快捷键(如 ]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

        但要注意,主函数的 argcargv 是通过命令行参数传递的,环境变量方式一般用于设置特定的程序行为。

如何在 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

这个变量包含了多个目录路径(比如 srclib)。

2. $(patsubst %,%/*.c, $(SOURCEDIRS))

patsubstMakefile 中的一个函数,用于模式替换。它的语法是:

$(patsubst pattern,replacement,text)

它会将 text 中所有匹配 pattern 的部分替换为 replacement

  • pattern:匹配的模式,这里是 %,代表任意字符串。
  • replacement:替换成的内容,这里是 /%/*.c,表示每个目录后面加上 /*.c,以匹配该目录下的 .c 文件。
  • text:要进行替换的字符串,这里是 $(SOURCEDIRS),即包含目录路径的列表。

举个例子,如果 SOURCEDIRS 包含 srclib,那么:

$(patsubst %,%/*.c, $(SOURCEDIRS))

会将 src 替换为 src/*.c,将 lib 替换为 lib/*.c,最终结果是:

src/*.c lib/*.c

这表示 srclib 目录下的所有 .c 文件。

3. $(wildcard ...)

wildcardMakefile 中的一个函数,用于匹配文件名。它接受一个模式字符串并返回匹配该模式的所有文件路径。假设有如下目录结构:

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. 解释

  1. lstat(path, &st):获取文件状态信息,并将结果存储在 st 中。
  2. S_ISDIR(st.st_mode) 等宏用于检查文件的类型。
  3. 权限是通过位掩码来检查的,例如,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 - 博客园

相关文章:

  • 开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构
  • 毕业项目-基于java的入侵检测与防御系统
  • 联想笔记本电脑在Windows下通过联想驱动实现风扇控制
  • MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点
  • 40岁的苦与乐
  • 硅谷甄选41集-71集
  • 百度AI开发者大会:连发多款AI应用,覆盖AI数字人等热门赛道
  • 【C++11】可变参数模板
  • 网络原理 - 9
  • 头歌实训之存储过程、函数与触发器
  • 【数据结构入门训练DAY-24】美国大选
  • MCP 安全困境与Agent安全框架的应对之道
  • 深度理解linux系统—— 了解操作系统
  • Maven的概念与初识Maven
  • Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术
  • 【大模型】Coze AI 智能体工作流从配置到使用实战详解
  • Simulink 数据存储机制:Base Workspace、Model Workspace 与 Data Dictionary 的核心区别
  • Python + Playwright:如何在Docker 容器运行测试?
  • docker容器运维工具——ctop
  • 基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
  • 加总理:目前没有针对加拿大人的“活跃威胁”
  • 屋顶上的阳光与火光:战争如何改变了加沙的能源格局
  • 来论|这无非就是一只“纸老虎”:评特朗普政府“关税战”
  • 国铁集团:一季度全国海铁运输商品车同比增长33.62%
  • 财政部部长:中方主张通过平等对话协商解决贸易和关税争议
  • 解放日报头版:外资汽车产业链布局上海步伐明显加快