Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15496387
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2011-04-13 11:49:23

linux解析kernel/bounds.s的sed使用

kernel/bounds.s
arch/arm/kernel/asm-offsets.s

->NR_PAGEFLAGS #23 __NR_PAGEFLAGS    @
->MAX_NR_ZONES #2 __MAX_NR_ZONES    @

echo '
->NR_PAGEFLAGS #23 __NR_PAGEFLAGS    @
->MAX_NR_ZONES #2 __MAX_NR_ZONES    @
' | sed -ne  \
    "/^->/{s:->#\(.*\):/* \1 */:; \
    s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
    s:->::; p;}"
输出结果为
#define NR_PAGEFLAGS #23 /* __NR_PAGEFLAGS@ */
#define MAX_NR_ZONES #2 /* __MAX_NR_ZONES@ */
我觉得这不应该是本意,因为c语言的#define定义中,没有#23这样的立即数定义方式,
echo \$$#数值为$0,原因是$#表示参数个数,因为没有参数,所以$#等于0,\$为$,所以就等于$0了
因此我们可以将[\$$#]修改为[\$#]
echo '
->NR_PAGEFLAGS #23 __NR_PAGEFLAGS    @
->MAX_NR_ZONES #2 __MAX_NR_ZONES    @
' | sed -ne  \
    "/^->/{s:->#\(.*\):/* \1 */:; \
    s:^->\([^ ]*\) [\$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
    s:->::; p;}"
输出结果为
#define NR_PAGEFLAGS 23 /* __NR_PAGEFLAGS@ */
#define MAX_NR_ZONES 2 /* __MAX_NR_ZONES@ */

其实kernel并没有问题,因为我们使用echo时表示在shell环境中执行,而linux执行上面代码是在
Kbuild这个makefile中执行的,所以


$(info $(shell echo "\$$#"))
输出结果为$#,在makefile中$$表示1个$,所以等效之后应该为\$#,
表示shell将$作为普通字符处理,而不是和$#组合[luther.gliethttp].
阅读(2848) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~