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

使用 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.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 - 博客园

相关推荐
何其有幸.1 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
白泽来了1 小时前
2个小时1.5w字| React & Golang 全栈微服务实战
笔记·go·react
丶Darling.1 小时前
26考研 | 王道 | 数据结构笔记博客总结
数据结构·笔记·考研
道长没有道观2 小时前
计算机操作系统笔记
笔记·考研·操作系统
程序猿(雷霆之王)2 小时前
Linux——进程间通信
linux·运维·服务器
何其有幸.3 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
riveting3 小时前
SD2351核心板:重构AI视觉产业价值链的“超级节点”
大数据·linux·图像处理·人工智能·重构·智能硬件
易保山4 小时前
MIT6.S081 - Lab10 mmap(文件&内存映射)
linux·操作系统·c
一点.点4 小时前
李沐动手深度学习(pycharm中运行笔记)——04.数据操作
pytorch·笔记·python·深度学习·pycharm·动手深度学习
.似水4 小时前
2025.4.22_C_可变参数列表
java·c语言·算法