我试图找到一种方法来读取包含一些#define&#39的C头文件,并将这些宏转换为可由shell脚本访问的bash变量。
我首先尝试的是:
gcc -E -dM header_file.h|grep '^#define'|awk '{var=$2;$1=$2="";sub(/^[ \t]+/, "");print "export " var "=\"" $0 "\""}' > /tmp/tmp.sh
source /tmp/tmp.sh
哪个有效,但我真的不喜欢我正在生成这个临时文件
我接下来尝试的是类似的,希望摆脱临时文件:
gcc -E -dM header_file.h|grep '^#define'|awk '{var=$2;$1=$2="";sub(/^[ \t]+/, "");print "export " var "=\"" $0 "\""}' |while read i
do
$i
done
这不起作用,但是......看起来应该有另一种方法来做到这一点,但我无法想到它,而且我很确定一旦有人发布了我&#39我会感到非常愚蠢,但是我仍然很欣赏任何人都可以提供给我指向正确方向的kickstart。
答案 0 :(得分:3)
一个复杂的解决方案:
#!/bin/bash
source <(\
sed -r '{
/^#define/!d
/#define[ \t]*[^ \t]*$/d
s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1="\2"/
/(""|\([^\)]*\))/d
}' <(gcc -E -dM HEADERFILE)
)
,其中
/^#define/!d
保持以#define
/#define[ \t]*[^ \t]*$/d
删除具有空宏定义的行
s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1=\2/
创造了平等
,该过程被替换,描述符可以来源。
答案 1 :(得分:1)
eval $(sed -n 's/^#define *\([^ ]*\) *\(.*\) *$/export \1=\2/p' file.c)
答案 2 :(得分:1)
source <(...)
语法需要Bash 4,不能在Bash 3或更低版本中运行。
使用eval
是邪恶的。实际上source
- 并不是更好。
这应该是相当安全和便携的:
while read -r def var val; do
printf -v $var "$val"
done < <(gcc -E -dM header_file.h | grep -E '^#define[ \t]+[a-zA-Z_][0-9a-zA-Z_]+')