LDD中 major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices)正确理解。

Ubuntu 20.04 TensorFlow 2.10 环境基线构建指南 TensorFlow 是一个用于机器学习和深度学习的开源框架,其运行依赖严格的 Python 版本、系统库(如 glibc、CUDA)、以及第三方包(如 numpy、protobuf)的版本对齐。在 Ubuntu 20.04 这类长期支持(LTS)系统中,环境不稳定性往往源于系统 Python 与用户环境的耦合、pip 全局安装导致的依赖污染,以及 GPU 加速所需的 CUDA/cuDNN 版本错配。TensorFlow 2.10 作为最后一个内置 GPU 支持的稳定版本,要求 Python 3.9、pip 阅读详情
 

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices)正确理解。

正确理解



导语:
        这条语句来自O’REILLY 《LINUX设备驱动第三版》字符设备章节的自动创建设备文件脚本代码。网上所有的O’REILLY 《LINUX设备驱动第三版》的电子书上一律这条语句。当时这条语句放入脚本,运行怎么也有错误,就错在双斜杠的地方。
   后来买了一本纸质正版书拜读,竟然发现书上的代码以及配套源代码此处一律用的是单斜杠,就是$的地方只有一个反斜杠
  


在我的linux上可以正确运行。我使用的是Fedora 9的2.6内核和Red  Hat 9的2.4的内核测试的。


      初学者刚刚开始读ldd3的时候,在关于动态创建设备文件的脚本的地方都感觉很困惑。那么通过我自己实际的操作反复验证之后得到了针对此语句主要疑难点做出如下解释:


1.此语句中awk使用了耍号“”,而没有使用单引号‘’

按照awk的规则和语法,awk整个语句由模式这操作两部分组成
     pattern     {action}     #如果模式匹配则执行操作
     pattern                      #如果模式匹配则执行打印
                    {action}     #针对每条记录执行操作
那么相像的说一条awk语句可以简化到
     A  -> B   #若A则B
那么任何脚本,awk也不例外,使用定界符比如:/(awk 正则表达式定界符),“”(字符串定界符)等等,其实最终是让解析程序认识。
在bash或者是shell脚本中,“”用双引号引起来的内容中允许变量替换,而用‘’单引号引起来的内容则不允许变量替换包括特殊符号。所以,这样看开究竟是用单引号还是双引号来定界内容其实是可以选择的,没有说必须是那种方式。


2.此语句中多次使用\反斜杠

目前我们说知道的脚本(bash,shell)都是使用\反斜杠来转义(SQL中有escape的说法),即是为了保证特殊字符当做普通字符来看。
结合语句和语法来看,对于awk,最终是要接收$1,$2,
我们以一个简单的例子来看,我们让一个脚本打印设备misc的设备号。不用这么复杂的条件模式,用一个简单的例子来说明这些论述
打印/proc/devices文件中名字为misc的设备号。


这是我的linux下devices的部分文件。按照awk字段来分,这里1,2,3….应该是$1,而后面的名字应该是$2。这是我的shell下键入命令后的效果



 

这是正确的结果。试想,如果我们对$不使用反斜杠。

运行命令:


这里报错。看看这句awk: cmd. line:1: =="misc"   {print },为什么==前是空,print后面也是空,不应该出现这种情况啊,因为我们明明用的事$2,$1啊,无论怎么说也不会是空啊。
不着急,我们再对脚本进行修改。

 

我们只将后面$1改成了$0

运行命令:


现在再来看看报错情况。

print后面出现了./autoawk
这是我们在bash命令行输入的。

现在我想你应该想到了,对于bash,shell脚本来说,$0,$1…等等,这些都是命令行输入参数的引用。
比如:
#  ./autoawk  a  b  c  d
那么,$0=./autoawk, $1=a, $2= b, $3 =c。这就开始明白了,如果我们不加反斜杠,那么$0,$1,$2就会被shell .bash当做它的参数,当脚本运行的时候,$0, $1, $2就会被替换成命令行参数。本来我们是想让awk接收的,现在却被shell,bash接收了替换了。为了不让$1,  $2被替换,我们在$前必须加反斜杠来禁止被替换 ,即\$1。禁止这种替换的另一种方法就是用单引号‘’,在脚本中‘’单引号内的内容按原样处理,不会有任何改变。
单引号和双引号作用的结果都能打印出相同的结果。唯一的区别是在于双引号需要对特殊字符转义,而单引号不需要。
awk "\$2= ="$module" {print \$1}" /proc/devices  #这里$module的引号没有特殊的用处,因为这里只是字符串的引用
awk ‘$2= ="$module" {print $1}’ /proc/devices
这两种方式达到的效果是一样的。


3.$前使用了双反斜杠\\$


[root@feiyinziiu fbin]# awk "\$2==\"misc\" {print \$1}" /proc/devices
10
[root@feiyinziiu fbin]# awk '$2=="misc" {print $1}' /proc/devices
10
这里的演示都是在命令行里直接键入的。shell也好,bash也好,脚本文件最终是读入到命令解释器当中的。此地方用反斜杠无非就是保留特殊字符,按照正常情况,\$1就已经达到避免$1被替换的目的了,对于此处\\$1,我觉得这是由于版本问题或者是其他原因,而且这种双斜杠运行时会提示错误,所以议这个地方还是以单反斜杠理解。至于到底此处当时为什么要用双反斜杠,只有去问魏永明了。
可以在OREILLY公布的驱动源码ftp://ftp.ora.com/pub/examples/linux/drivers/中获得《LINUX设备驱动程序》的源代码。在我此时写到这个地方的时候,我又登陆了此服务器,发现里面仍然只有第二版的源码dd2-samples,还没有第三版的源码。ldd2-samples中scull下有个scull_load脚本。里面的关于自动创建设备节点的部分代码如下:


在我的纸质书同时于此书配套的源代码都是如下的代码:

《LINUX设备驱动》官方公布了2种不同的反斜杠,应该说明是对第二版本的修订。

用废旧汽车电池DIY家用UPS:手把手教你低成本搭建Wi-Fi不断电系统 本文详细介绍了如何利用废旧汽车电池DIY低成本家用UPS系统,确保Wi-Fi设备在断电时持续供电。通过精选材料、电路搭建和安全防护,实现高效稳定的电源转换与智能切换,成本仅为市售UPS的三分之一。特别适合家庭办公和远程工作者提升网络供电可靠性。 阅读详情

相关推荐

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1568

/proc/devices和/dev的关系

/proc/devices/下的设备是驱动程序生成的,它可产生一个major供mknod作为参数。 /dev/下的设备是通过mknod加上去的,用户通过此设备名来访问驱动。 The following script,scull_load, is part of thesculldistribution. The user of a driver that is distribu...

EmbeddedCoder 的优快云博客 1971

PromptBio实战:如何用AI对话搞定转录组数据分析(附详细操作截图)

本文详细介绍了如何利用PromptBio平台通过AI对话完成转录组数据分析,无需编程基础即可实现从数据上传到结果解读的全流程。文章包含详细的操作截图和参数配置建议,帮助科研人员快速掌握这一生信分析工具,显著提升研究效率。

weixin_30872157的博客 135

Shell脚本根据设备名自动获取设备号

写驱动的时候如果使用自动分配设备号的方式,在创建设备结点的时候需要在 '/proc/devices' 文件中查看一下所分配的设备号。可以通过awk命令: awk '{if($2=="your-driver") {print $1}}' /proc/devices mknod.sh 这个脚本能够自动获取设备号并创建设备节点: #!/bin/bash driver=$1 d

hustfoxy的专栏 2869

如何在Jetson Nano上快速搭建Pytorch环境(含torchvision安装教程)

本文详细介绍了在Jetson Nano上快速搭建PyTorch环境的完整步骤,包括系统准备、PyTorch安装优化、torchvision编译安装及环境测试。通过本指南,开发者可以高效部署深度学习开发环境,充分利用Jetson Nano的GPU加速能力进行计算机视觉项目开发。

weixin_42628941的博客 340

Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 01

在主控类中绑定登录类的信号 void signalLoginOK() ,跳过验证步骤,先实现页面的跳转MyChatToolClient.h文件//登录成功槽函数 private :MyChatToolClient.cpp文件} //登录成功槽函数 void MyChatToolClient :: slotLoginOk() {//关闭登录窗口并释放空间 m_loginWin -> close();//新建并打开聊天窗口 m_chatWin = new ChatWindow;

Leo的博客 1872

awk中的正则表达式里如果出现正斜杠(forward slash)“/”的解决方法

今天想把 passwd 里的用户名和对应文件夹列出来,其中用户要筛选在“/share/home”里的。 首先查看了一下网上的 awk 说明,写了下面一行: ypcat passwd | awk -F: '{print $1,$6}' 这样可以把用户名和所在文件夹筛出来,但是不能筛选特定文件夹里的信息。 因此使用正则表达式去匹配。但是在匹配过程中发现,由于正则表达式是需要夹在两条正斜杠中的,而 $6 当中本来就有正斜杠,于是想过用以下方法,但都没有成功,最后用了两次正则表达式勉强可以: # 1.

代码 3145

海康威视iSC平台视频流对接:RTSP、HLS、WS三种协议到底该怎么选?

本文深入分析海康威视iSC平台视频流对接中RTSP、HLS和WebSocket三种协议的优缺点,帮助开发者根据实时性、兼容性和网络环境做出最优选择。特别适合综合安防管理平台的Web视频监控系统开发,提升用户体验和系统性能。

weixin_28365523的博客 691

巧用awk快速拷贝ldd库文件依赖

写一个SHELL脚本,自动拷贝依赖的动态库。 touch test.sh dep=$( ldd $1 | awk '{if (match($3,"so")){print $3}}' ) cp -L -n $dep $2 -n: don’t overwrite, 不覆盖原有文件 -L: follow symbolic link in source, 如果是软链接,则拷贝源链接文件 这里awk会使用默认的空格分割符对ldd输出的每一行进行分割,如果分割出的第3个参数中含有"so",则将其赋值给d

huangkangying的专栏 1258

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

YOLOv8优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

将 PST 嵌入当前最先进的实时检测模型(YOLOv11-N/S/M)后,在 MS COCO 上的 mAP 分别提升 0.9%、0.5%、0.4%,而延迟增加极小。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 612

AWK

一,正则表达式 \w匹配数字、字母、下划线 egrep"roo\w"user//找roo后面是数字、字母、下划线的字符串 \s匹配空格、tab键 egrep"roo\s"user//找roo后面是1个空格或者tab键打出来的空格的字符串,如果没有 就不输出 二,sed其他指令 a行下追加i行上添加c替换整行 sed'a666'user//所有行的下面追加666 sed'1a666'user//第1行的下面追加666...

m0_67981281的博客 652

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1660

major=$(awk "//$2= =/"$module/" {print //$1}" /proc/devices)正确理解。

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <! /* Style Definiti

Legend(谭海燕)的专栏 4769

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LDD3 中 awk 语句的解释

在ldd3 的一个创建节点的shell脚本中,用到了awk文本处理工具,在这里做一下解释。    原句:major=$(awk "\\$2==\"$module\" {print \\$1}"/proc/devices)          Module变量在脚本中定义为  scull.        /proc/devices是awk要处理的输入文件。

自由的代价永远是警惕 730

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

awk参数转义

网上有许多print打印内容如何输出单引号(')、货币符号($)文章,但没有参数。关于参数如何转义,用一个例子说明: 打印货币符号: echo 'MyTest' | awk -F '.' '{print "\_OBJC\_CLASS\_\$\_" $1}'输出: _OBJC_CLASS_$_MyTest 过滤货币符号: echo '_OBJC_CLASS_$_MyTest'

xjkstar的专栏 8222

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

awk 用法详解

awk 用法:awk ' pattern {action} '   变量名    含义  ARGC   命令行变元个数  ARGV   命令行变元数组  FILENAME   当前输入文件名  FNR   当前文件中的记录号  FS   输入域分隔符,默认为一个空格  RS   输入记录分隔符  NF   当前记录里域个数  NR   到目前为止记录数  OFS   输出域

博主是个懒蛋 5359

linux 下快速打包程序依赖库的命令

ldd "程序名" | awk '{print $3' | xargs -i cp -L {} "要拷贝到的目录" eg: ldd iprobe | awk '{sprint $3}' | xargs -i cp -L {} /home/iprobe_lib/

superbfly的专栏 6106

ldd命令原理与使用

作用:用来查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题。 ldd命令原理(摘自网络) 1、首先ldd不是一个可执行程序,而只是一个shell脚本 2、 ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、 LD_WARN、LD_BIND_NOW、LD_LIBRARY_VER

crazyhacking的专栏 1226

Linux设备驱动程序 三 字符设备驱动

Linux设备驱动程序 三 字符设备驱动 笔记 第三章 字符驱动设备 本章会编写一个完整的字符设备,字符设备简单,易于理解, 名字是scull:Simple Caracter Utility for Loading Localities,区域装载的简单字符工具, scull是一个操作内存区域的字符设备driver,这片内存区域就相当于一个设备。 它不和硬件相关,只是操作...

小老鼠的博客 1908

《LINUX设备驱动程序》读书笔记---------字符设备(一)

文章目录

森子格 373

kernel module编程(三):获取(分配或注册)设备号

  本文也即是《Linux Device Drivers》一书第三章Char Drivers的读书笔记之一。   我们在/dev中可以查看设备节点,每个设备有一个主号码(major) 以及一个副号码(minor),通常一个major号码对应某一种设备,虽然linux允许多种设备共享一个major号码。minor号码用于 kernel具体进行设备的对应,kernel并不了解...

编程开发资料库 193

linux设备驱动程序3,linux设备驱动程序3-字符驱动

中,原型如下:#ifdef __compiler_offsetof#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)#else#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#endif例如:int scull_open(struct ...

weixin_33100393的博客 233

Linux Devices Major and Minor Numbers

Major and Minor NumbersChar devices are accessed through names in the filesystem. Those names are called special files or device files or simply nodes of the filesystem tree; they are conventional

ifelif 659
上一篇: AWK --脚本语言、工具详解 (GCC内嵌,如同SQL 字段驱动解析文本)
下一篇: LINUX内核和驱动中常见的 C语法---》标记化 初始化
chepwavege
博客等级 码龄16年 170粉丝 119原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值