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) |