35、Unix 开发工具与脚本语言全解析

Unix 开发工具与脚本语言全解析

在 Unix 系统开发中,有许多实用的工具和脚本语言,它们能帮助开发者更高效地完成工作。下面将详细介绍这些工具和语言的使用方法和特点。

1. 共享库安装与预防措施

在安装共享库时,可采用一致的方法,使用 -Wl,-rpath 来创建运行时链接路径,或者直接使用不常用库的静态版本,以此预防可能出现的问题。

2. make 工具

当程序包含多个源文件或需要特殊编译选项时,手动编译会变得十分繁琐。而 make 作为传统的 Unix 编译管理工具,能有效解决这一问题。

2.1 make 的基本概念
  • 目标(target) :是 make 要达成的目标,可以是文件(如 .o 文件、可执行文件等)或标签。
  • 依赖(dependencies) :部分目标依赖于其他目标,例如生成可执行文件前需要先有完整的 .o 文件集合。
  • 规则(rule) : make 依据规则生成目标,它本身自带许多规则,同时也支持自定义规则。
2.2 Makefile 示例

以下是一个简单的 Makefile,用于从 aux.c 和 main.c 生成名为 myprog 的程序:

# arquivos-objeto
OBJS=aux.o main.o
all: myprog

myprog: $(OBJS)
        $(CC) -o myprog $(OBJS)
  • 首行的 # 表示注释。
  • OBJS 是宏定义,定义了两个目标文件名,后续通过 $(OBJS) 引用。
  • all 是默认目标,即直接执行 make 时要创建的目标。
  • all 依赖于 myprog ,而 myprog 依赖于 $(OBJS) 展开后的 aux.o 和 main.o 。

执行 make 时,输出如下:

$ make
cc    -c -o aux.o aux.c
cc    -c -o main.o main.c
cc -o myprog aux.o main.o
2.3 预设规则

make 知道如何从 .c 文件生成 .o 文件,即使 .c 文件未在 Makefile 中明确列出,它也会遵循预设规则,执行 cc -c 命令来完成转换。

2.4 最终程序生成

生成 myprog 的最后一步,是在拥有 $(OBJS) 中的两个目标文件后,执行以下命令( $(CC) 会展开为编译器名称):

$(CC) -o myprog $(OBJS)

注意,命令前必须有一个制表符,否则会出现 Makefile:7: *** missing separator. Stop. 错误。

2.5 保持更新

make 的一个重要原则是目标要与其依赖保持同步。例如,连续两次执行 make ,第一次会生成 myprog ,第二次则会提示 make: Nothing to be done for 'all'. ,因为依赖文件未发生变化。若要测试更新机制,可按以下步骤操作:
1. 执行 touch aux.c 。
2. 再次执行 make ,此时 make 会判断 aux.c 比 aux.o 新,从而重新编译 aux.c 。
3. 由于 myprog 依赖于 aux.o ,且 aux.o 比 myprog 新,所以 make 会重新创建 myprog 。

2.6 命令行参数和选项
  • 指定单个目标 :可在命令行指定单个目标,如 make aux.o 仅生成 aux.o 文件。
  • 定义宏 :能在命令行定义宏,例如使用 clang 编译器:
$ make CC=clang
  • 无 Makefile 执行 :若 make 的预设规则能匹配目标,可直接执行 make 尝试创建目标,如 make blah 可处理简单的 blah.c 程序。不过,对于需要特殊库或包含目录的程序,通常需要创建 Makefile。
  • 重要选项 :
  • -n :显示构建所需命令,但不实际执行。
  • -f arquivo :让 make 从指定文件读取规则,而非默认的 Makefile 或 makefile。
2.7 常用宏和变量
  • 宏(macro) :通常在 Makefile 开头定义,常见的有:
    | 宏名称 | 说明 |
    | ---- | ---- |
    | CFLAGS | C 编译器选项 |
    | LDFLAGS | 链接器选项,用于从目标代码创建可执行文件 |
    | LDLIBS | 存放库名选项,避免与搜索路径选项混合 |
    | CC | C 编译器,默认是 cc |
    | CPPFLAGS | C 预处理器选项 |
    | CXXFLAGS | GNU make 中 C++ 编译器的标志 |
  • 变量(variable) :在生成目标过程中会发生变化,常见的有:
    | 变量名 | 说明 |
    | ---- | ---- |
    | $@ | 在规则中展开为当前目标 |
    | $* | 展开为当前目标的基本名称,如生成 blah.o 时展开为 blah |
2.8 常规目标

多数 Makefile 包含以下常规目标:
- clean :通常用于删除所有目标文件和可执行文件,以便重新开始或打包软件。例如:

clean:
        rm -f $(OBJS) myprog
  • distclean :用于移除所有不属于原始发行版的内容,包括 Makefile。
  • install :将编译好的文件和程序复制到系统中合适的位置。执行前建议先使用 make -n install 查看操作内容。
  • test 或 check :部分开发者提供此目标,用于确保构建后一切正常。
  • depend :通过 -M 选项调用编译器检查源代码来创建依赖关系,不过这种做法现在不太常见。
  • all :通常是 Makefile 的第一个目标,常作为可执行文件的引用。
2.9 Makefile 组织

虽然 Makefile 有多种风格,但多数程序员遵循一些通用规则:
- 宏定义 :将库和包含文件按包分组,例如:

MYPACKAGE_INCLUDES=-I/usr/local/include/mypackage
MYPACKAGE_LIB=-L/usr/local/lib/mypackage -lmypackage
PNG_INCLUDES=-I/usr/local/include
PNG_LIB=-L/usr/local/lib -lpng
CFLAGS=$(CFLAGS) $(MYPACKAGE_INCLUDES) $(PNG_INCLUDES)
LDFLAGS=$(LDFLAGS) $(MYPACKAGE_LIB) $(PNG_LIB)
  • 目标文件分组 :目标文件通常按可执行文件分组。例如,有 boring 和 trite 两个可执行文件,每个都有自己的 .c 文件且依赖 util.c ,可这样组织:
UTIL_OBJS=util.o
BORING_OBJS=$(UTIL_OBJS) boring.o
TRITE_OBJS=$(UTIL_OBJS) trite.o
PROGS=boring trite
all: $(PROGS)
boring: $(BORING_OBJS)
        $(CC) -o $@ $(BORING_OBJS) $(LDFLAGS)
trite: $(TRITE_OBJS)
       $(CC) -o $@ $(TRITE_OBJS) $(LDFLAGS)

不建议将两个可执行目标合并为一个规则,否则可能导致依赖关系错误。

3. 调试器(Debuggers)

在 Linux 系统中,默认的调试器是 gdb ,同时也有用户友好的前端工具,如 Eclipse IDE 和 Emacs 系统。

3.1 调试准备

为了能对程序进行完整调试,需在编译时使用 -g 选项,将符号表和其他调试信息记录到可执行文件中。

3.2 gdb 基本操作
  • 启动 gdb :
$ gdb programa
  • 执行程序并传递参数 :在 (gdb) 提示符下输入:
(gdb) run opções
  • 打印变量值 :使用 print 命令查看变量值,该命令也适用于 C 语言中的数组和结构体。
(gdb) print variável
  • 设置断点 :
(gdb) break arquivo:num_linha
  • 继续执行 :
(gdb) continue
  • 清除断点 :
(gdb) clear arquivo:num_linha
4. Lex 和 Yacc

在编译读取配置文件或命令文件的程序时,可能会用到 Lex 和 Yacc,它们是编程语言的构建块。
- Lex :是一个标记生成器(tokenizer),将文本转换为带标签的数字标记。GNU/Linux 版本为 flex ,可能需要 -ll 或 -lfl 链接标志。
- Yacc :是一个解析器,尝试根据语法读取标记。GNU 解析器是 bison ,使用 bison -y 可与 Yacc 兼容,可能需要 -ly 链接标志。

5. 脚本语言

过去,Unix 系统管理员主要关注 Bourne shell 和 awk 脚本语言。如今,虽然 shell 脚本仍是 Unix 的重要组成部分,但 awk 在脚本领域的使用逐渐减少,取而代之的是许多功能强大的脚本语言。

5.1 脚本语言的基本信息

所有脚本语言的脚本首行都类似 Bourne shell 脚本的 shebang。例如,Python 脚本以如下内容开头:

#!/usr/bin/python

或

#!/usr/bin/env python

在 Unix 中,以 #! 开头的可执行文本文件就是脚本, #! 后面的路径名是脚本语言解释器的可执行文件。当 Unix 尝试执行以 #! 开头的文件时,会执行 #! 后面的程序,并将文件其余部分作为标准输入。

5.2 常见脚本语言
  • Python :拥有众多追随者,具备强大的功能,如文本处理、数据库访问、网络和多线程等。其可执行文件通常为 /usr/bin/python ,还常用于网站开发。
  • Perl :是 Unix 中较古老的第三方脚本语言,曾是编程工具的“瑞士军刀”。尽管近年来在某些方面被 Python 超越,但在文本处理、文件转换和操作方面表现出色。
  • 其他脚本语言 :
  • PHP :是超文本处理语言,常用于 Web 开发。

通过合理运用这些工具和脚本语言,开发者能在 Unix 系统上更高效地进行开发和调试工作。

Unix 开发工具与脚本语言全解析

5.3 脚本语言使用注意事项
  • 解释器路径问题 :脚本首行指定的解释器路径必须正确,否则会出现错误。例如,若脚本首行为 #!/usr/bin/tail -2 ,而系统中 tail 实际路径为 /bin ,执行脚本会报错:
bash: ./myscript: /usr/bin/tail: bad interpreter: No such file or directory
  • 命令行参数问题 :不建议在脚本首行添加多个参数,因为不同系统处理方式可能不同,容易导致意外结果。

下面通过一个 mermaid 流程图展示脚本执行的基本流程:

graph TD;
    A[开始] --> B{是否以 #! 开头};
    B -- 是 --> C[获取 #! 后路径];
    C --> D[执行对应程序];
    D --> E[将脚本其余部分作为输入];
    E --> F[程序处理并输出结果];
    B -- 否 --> G[非脚本文件,结束];
    F --> H[结束];
6. 总结与操作建议

为了更清晰地对比不同工具和脚本语言的特点及使用场景,我们整理了以下表格:
| 工具/语言 | 主要功能 | 使用场景 | 操作要点 |
| ---- | ---- | ---- | ---- |
| make | 编译管理 | 处理多源文件或特殊编译选项的程序 | 编写 Makefile,注意目标、依赖、规则的设定,命令前用制表符分隔 |
| gdb | 程序调试 | 查找程序中的错误 | 编译时加 -g 选项,掌握 run 、 print 、 break 等基本命令 |
| Lex(flex) | 标记生成 | 处理文本转换为标记的任务 | 可能需 -ll 或 -lfl 链接标志 |
| Yacc(bison) | 语法解析 | 解析标记并根据语法处理 | 用 bison -y 与 Yacc 兼容,可能需 -ly 链接标志 |
| Python | 脚本编程 | 文本处理、数据库访问、网站开发等 | 脚本首行用 shebang 指定解释器路径 |
| Perl | 脚本编程 | 文本处理、文件转换和操作 | 学习其基本语法和常用函数 |
| PHP | 超文本处理 | Web 开发 | 搭建 Web 服务器环境进行开发 |

在实际开发中,可按以下步骤选择和使用这些工具和语言:
1. 确定需求 :明确开发任务的具体需求,如编译管理、调试、文本处理等。
2. 选择工具/语言 :根据需求从上述表格中选择合适的工具或语言。
3. 学习操作要点 :针对所选工具或语言,学习其操作要点和注意事项。
4. 实践应用 :在实际项目中运用所学知识,不断积累经验。

以下是一个简单的操作流程列表,展示如何使用 make 和 gdb 进行程序开发和调试:
1. 编写源代码 :创建 .c 源文件,如 aux.c 和 main.c 。
2. 编写 Makefile :

# arquivos-objeto
OBJS=aux.o main.o
all: myprog

myprog: $(OBJS)
        $(CC) -o myprog $(OBJS)
  1. 编译程序 :
$ make
  1. 调试准备 :在编译时添加 -g 选项:
$ make CC="cc -g"
  1. 启动调试 :
$ gdb myprog
  1. 执行调试命令 :如设置断点、打印变量等。

通过以上对 Unix 开发工具和脚本语言的详细介绍,希望能帮助开发者更好地掌握这些工具和语言的使用,提高开发效率和质量。在实际应用中,不断探索和实践,将这些知识灵活运用到具体项目中。

相关推荐

20、UNIX时间管理、用户与组管理全解析

本文深入解析了UNIX系统中的时间管理与用户组管理机制。通过DTime类展示了时间的设置、获取、格式化以及区域设置对时间显示的影响。同时,详细介绍了用户ID(UID)和组ID(GID)的基本概念、相关操作函数,以及它们在文件权限和进程控制中的应用。还探讨了/etc/passwd文件结构、密码验证流程及用户信息获取方法,为UNIX系统开发与安全管理提供了全面指导。

108

22、UNIX 文本处理与杂项命令全解析

本文深入解析了UNIX系统中的强大文本处理工具awk以及多个常用的杂项命令,包括eval、:、type、sleep、find和xargs。内容涵盖awk编程基础、字段操作、模式匹配、流程控制,以及如何利用find和xargs进行高效文件查找与处理。此外,还介绍了其他内置和外部命令的使用场景及优化技巧,适用于文本处理、系统管理和自动化脚本开发。

ik678901的博客 103

35、UNIX系统安全与漏洞探索

本文探讨了UNIX系统的安全与漏洞,特别是以Solaris 10为例,分析了Telnet协议的漏洞及其利用方式,并介绍了相关黑客工具和应对策略。同时,文章提供了具体的安全建议,包括服务替换、系统更新、网络监控等,旨在帮助系统管理员提高UNIX环境的安全性。

plant的博客 60

26、Unix/Linux 文本格式化与打印全解析

本文深入解析了Unix/Linux系统中的文本格式化与打印工具,涵盖了从基础的printf命令到复杂的文档排版系统如groff的应用。同时详细介绍了各类打印命令如pr、lpr、lp、a2ps的使用方法,并通过流程图总结了完整的打印流程。无论对于日常文本处理还是专业文档排版,这些工具都能满足多样化需求。

snow3的博客 171

35、RMAN脚本编写与任务调度全解析

本文详细解析了在Unix和Windows环境下编写RMAN脚本并进行任务调度的方法。涵盖RMAN脚本的优势、Unix中使用cron调度Shell脚本、Windows中开发和调度批处理文件、日志与错误处理的最佳实践,以及不同环境下调度工具的对比与选择建议。适合数据库管理员提升备份任务自动化水平,保障数据安全与可用性。

ll5678的博客 64

35、Linux进程、信号与POSIX线程全解析

本文深入解析了Linux系统中的进程、信号以及POSIX线程的相关知识。从进程与信号的基础概念入手,详细介绍了线程的创建、同步、属性修改及控制方法。通过示例代码展示了如何使用pthread库进行多线程编程,并探讨了多线程程序的优缺点及常见问题的解决方案。文章旨在帮助开发者更好地理解和应用多线程技术,提高程序的性能和响应能力。

oo7890的博客 84

35、RMAN脚本编写与调度全解析

本文深入解析了在Unix和Windows系统中进行RMAN脚本编写与调度的多种方法。内容涵盖Unix下的cron调度工具使用、Shell脚本开发、crontab编辑与更新,以及Windows下的批处理文件开发、任务调度器配置、GUI操作等。文章还提供了实际案例、常见问题及解决方法,并对两种系统的调度方式进行了对比总结,帮助数据库管理员高效管理RMAN备份任务,确保数据安全与可用性。

vscode6remote的博客 67

35、UNIX数据恢复与时间同步的全面指南

本文全面介绍了UNIX系统中的数据恢复与时间同步技术。内容涵盖交互式数据恢复操作、frecover命令的使用及自动化脚本示例、单磁带上多文件系统的恢复方法,以及Berkeley与非Berkeley风格磁带设备的控制差异。同时详细讲解了NTP网络时间协议的工作原理,xntpd守护进程的配置与运行,包括peer、server、broadcast等关键配置项,并提供了HP-UX、Solaris和Linux平台的配置实例,为系统管理员进行数据管理和时间同步提供了实用指南。

vim8coder的博客 37

35、Samba 安全配置与管理全解析

本文深入解析了Samba服务器的安全配置与管理方法,涵盖安全信息获取、配置文件保护、用户访问控制、密码管理、PAM配置、访问限制、服务安全级别设置以及安全风险防范等内容。通过详细的技术指导与最佳实践建议,帮助系统管理员全面提高Samba服务器的安全性,保障网络环境的稳定与可靠运行。

year5的博客 156

深入Unix Shell脚本精讲

本文还有配套的精品资源,点击获取 简介:Unix Shell脚本是自动化任务和系统管理的强效工具。本书提供丰富的学习材料,包括引导文档、中文指南和一系列脚本实例,涵盖从基础到高级的主题,如变量、条件语句、循环、函数定义、输入/输出重定向和管道操作。掌握这些内容有助于提升系统管理效率和自动化脚本编写能力。 1. Unix Shell脚本基础与应用 Unix/Lin...

weixin_42599908的博客 1278

精通UNIX Shell脚本编程(附源代码)

基本信息 * 原书名: Mastering UNIX Shell Scripting * 原出版社: Wiley * 作者: (美)Randal K. Michael [作译者介绍] * 译者: 詹文军[同译者作品] 邓波 * 出版社:电子工业出版社 * ISBN:7121008467 * 上架时间:2005-1-31 * 出版日期:2005 年1月 * 开本:16开 * 页码:516 * 版次:1-1 * 所属分类: 计算机 > 操作系统 > UNIX 教材 > 研究生/本科/专科教材 > 工学 > 计算机 教材 > 计算机教材 > 本科/研究生 > 计算机专业 > 计算机专业课程 > 操作系统 内容简介回到顶部↑ 本书中使用的技术将教会读者如何理性地处理问题,同时还使得读者能够根据基本的命令语法 来将它转换为一个针对特定问题的shell脚本解决方案。 本书提供了许多完整的脚本,可以将它们用于自动完成重复的任务和解决现实系统管理问题的 shell脚本。这些任务包括: ● 通信,例如自动的事件通知;监视本地或远程系统上的进程:自动的FTP文件传输 ● 针对文件系统、页面调度/交换空间、系统负载、应用程序、进程的信息收集与监视活动, 捕获系统配置 ● 打印队列管理,保证打印机正常打印 ● 使用bc工具程序在shell脚本中进行浮点数学运算 本书配套的Web网站(www.wiley.com/compbooks/michael)上包含了本书中讨论的所有shell 脚本和大部分函数,同时还提供了针对各种任务的其他shell脚本。 本书详细介绍如何编写shell脚本来解决实际生活中遇到的UNIX问题和任务。本书面向所有的UNIX版本,重点覆盖对象包括AIX、Linux、 HP-UX和Solaris操作系统。本书的每一章都以一个经常遇到的UNIX问题作为开始。对于每个问题,都定义了一个明确的目标。在了解了目标和命令语法之后,读者可以根据命令来创建shell脚本。本书的特点是从基础开始,然后在解决方案中加入越来越多的判断逻辑。针对复杂程度不同的各种问题,本书分别用不同的章节加以介绍。 本书面向那些通过命令行方式使用UNIX的用户。在本书中讨论的主题主要针对UNIX专业人员—程序员、系统分析员、系统操作员、系统管理员,以及任何希望在技术支持领域取得进步的人。 作译者回到顶部↑ 本书提供作译者介绍 Randal K.Michael是一位在可口可乐公司任职的UNIX系统管理员,他编写了许多shell脚本来处理 UNIX下复杂的系统监视和事件通知问题。他具有23年的工作经验:同时担任UNIX系统管理员达10年 之久,熟悉Solaris、Linux、AIX和HP-UX操作系统。

Unix脚本编程快速入门和概述.pdf

Unix脚本编程快速入门和概述

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1878

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 676

56-FMC连接器电路设计

FMC连接器电路设计

weixin_66510961的博客 4723

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

使用 Tesseract 在 C# 中进行光学字符识别(OCR)

你可以根据需要对 Tesseract 进行自定义配置,例如设置识别的分辨率、识别模式等。// 只识别数字// 设置自定义变量本文只讲述了简单的使用方法,未涉及字库训练,识别的准确率与训练的字库有关。

仰望星空的博客 4733

EZ-INSAR工具箱(使用历史问题)

把 rasterio 升到 1.3+(或退回 py39)→features能 import → 脚本能跑 → 出图 → MATLAB 不再报错!

2301_79258000的博客 121

【深度解析TI InstaSPIN】无传感器FOC控制的核心方案

TI InstaSPIN通过“自动识别+通用观测器+开源工具链”的组合,解决了无传感器FOC控制开发难度大、周期长的核心痛点。其核心优势在于快速统一软件观测器的通用性与高精度,以及Fly Start闭环零速启动策略的高可靠性,可适配空调压缩机等家电电机的复杂运行需求。在空调外机双电机控制场景中,InstaSPIN与TI C2000系列MCU(F280013x/F28E12x)完美契合,借助MCU的高性能DSP内核与丰富外设,可实现双电机的精准同步控制,同时降低硬件成本与开发周期。

昔时扬尘处 326

基于强化学习控制策略的三相逆变器仿真

强化学习控制器的核心在于定义状态空间、动作空间、奖励函数以及选择合适的强化学习算法(例如DQN、DDPG等)。对于三相逆变器,状态可以是输出电压、电流等信息;动作则可能是调制指数的变化量;奖励函数则应鼓励快速准确地跟踪参考信号。定义状态空间和动作空间状态空间可以包括逆变器的输出电压、电流及其变化率等信息。动作空间则是控制器可执行的动作,例如PWM信号的调整幅度。matlab深色版本% 定义状态和动作空间维度numObs = 6;% 假设有六个状态变量(例如三相电压和电流)

amy_mhd的博客 135

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 9、交流稳态分析:原理、方法与应用
下一篇: 6、模拟测试全解析:从基础到未来趋势
杠精协会主席
博客等级 码龄3年 75粉丝 1287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值