Linux扩展

目录

扩展

查找如何进行后台运行程序的指令

[使用 & 符号](#使用 & 符号)

[使用 nohup 命令](#使用 nohup 命令)

[使用 screen 或 tmux](#使用 screen 或 tmux)

find命令

基本语法

常用选项

[grep 命令](#grep 命令)

基本语法

常用选项

[如何使用 vim 直接定位到错误行](#如何使用 vim 直接定位到错误行)

[1. 使用 :make 和 :copen](#1. 使用 :make 和 :copen)

[2. 使用 :lineno 定位](#2. 使用 :lineno 定位)

[3. 通过 :grep 或 :vimgrep](#3. 通过 :grep 或 :vimgrep)

[4. 错误标记和高亮](#4. 错误标记和高亮)

[5. 自动跳转(插件)](#5. 自动跳转(插件))

[6.进入到 vim 后,:行号](#6.进入到 vim 后,:行号)

[7. vim 文件名 +行号](#7. vim 文件名 +行号)

使用/字符串查找完之后,如何取消高亮

[利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件](#利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件)

[gdb 主函数传参 3 种方式](#gdb 主函数传参 3 种方式)

[(1) 在命令行中传递参数](#(1) 在命令行中传递参数)

[(2) 使用 set args 命令传递参数](#(2) 使用 set args 命令传递参数)

[(3) 在程序启动时通过环境变量传递](#(3) 在程序启动时通过环境变量传递)

[如何在 makefile 文件中做 echo 提示且不显示执行指令](#如何在 makefile 文件中做 echo 提示且不显示执行指令)

[SOURCES := (wildcard (patsubst %,%/*.c, (SOURCEDIRS)))](#SOURCES := (wildcard (patsubst %,%/*.c, (SOURCEDIRS))))

[1. (SOURCEDIRS)](#1. (SOURCEDIRS))

[2. (patsubst %,%/\*.c, (SOURCEDIRS))](#2. (patsubst %,%/*.c, (SOURCEDIRS)))

[3. (wildcard ...)](#3. (wildcard ...))

[4. 综合结果](#4. 综合结果)

5.举例

[lstat 判断文件权限用的宏](#lstat 判断文件权限用的宏)

[1. lstat 函数](#1. lstat 函数)

[2. st_mode 字段和文件权限](#2. st_mode 字段和文件权限)

[3. 判断文件权限的宏](#3. 判断文件权限的宏)

[4. 示例代码:如何使用 lstat 判断文件权限](#4. 示例代码:如何使用 lstat 判断文件权限)

[5. 解释](#5. 解释)

[6. 结果示例](#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 窗口中。你可以通过以下步骤直接定位到错误行:

  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. 自动跳转(插件)

如果你经常需要定位错误行,也可以使用一些插件,比如 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.c
  file2.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.c
  file2.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 - 博客园

相关推荐
Zwawa1 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式
Soneswy1 小时前
Linux系统篇--重定向与文件操作命令
linux
有毒的教程1 小时前
Linux底层存储路由配
linux·运维·网络
Linux系统运维工程师_郭主任2 小时前
运维人还在被拒offer?现在能考的,只有 RHCE 10.0。
linux
wujiuhsu3 小时前
图片里的简体中文怎么翻译成繁体?商品图、详情页和海报批量转换方法
经验分享·笔记
自养Agent3 小时前
MCP Server Boundary Audit Report
linux·服务器·人工智能·windows·大模型·llm
Coisinier4 小时前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
A心有千千结4 小时前
通过 SSH 反向代理让服务器借用本机网络访问 GitHub 的最佳实践
linux·服务器·网络·git·ssh·github
书生执笔画浮沉5 小时前
Linux 内核模块为什么不能自己解决兼容性问题?
linux·c·kernel·update·灵感
15Moonlight5 小时前
Linux网络(03):Socket 编程 TCP
linux·网络·tcp/ip