J'essaie de trouver un moyen de lire un fichier d'en-tête C qui contient des # define et de convertir ces macros en variables bash accessibles par un script shell.
Voici ce que j'ai essayé en premier:
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
Ce qui a fonctionné, mais je n'aimais vraiment pas que je génère ce fichier temporaire
Ce que j'ai essayé ensuite était similaire, dans l'espoir de me débarrasser du fichier temporaire:
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
Cela n'a pas fonctionné, cependant ... Il semble qu'il devrait y avoir une autre façon de faire cela, mais je ne peux pas y penser, et je suis presque sûr qu'une fois que quelqu'un publiera comment je vais me sentir vraiment stupide, mais J'apprécierais toujours le kickstart que tout le monde peut offrir pour me diriger dans la bonne direction.
3 réponses
Une solution sophistiquée:
#!/bin/bash
source <(\
sed -r '{
/^#define/!d
/#define[ \t]*[^ \t]*$/d
s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1="\2"/
/(""|\([^\)]*\))/d
}' <(gcc -E -dM HEADERFILE)
)
Où
/^#define/!d
conserve les lignes commençant par #define
/#define[ \t]*[^ \t]*$/d
supprime les lignes avec des définitions de macro vides
s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1=\2/
crée des égalités
, le processus est remplacé et le descripteur peut être obtenu.
La syntaxe source <(...)
nécessite Bash 4, ne fonctionne pas dans Bash 3 ou une version antérieure.
Utiliser eval
est mal. Et en fait source
- ce n'est pas mieux de toute façon.
Cela devrait être raisonnablement sûr et portable:
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_]+')
eval $(sed -n 's/^#define *\([^ ]*\) *\(.*\) *$/export \1=\2/p' file.c)
De nouvelles questions
bash
Pour des questions sur les scripts écrits pour le shell de commande Bash. Pour les scripts shell avec des erreurs / erreurs de syntaxe, veuillez les vérifier avec le programme shellcheck (ou sur le serveur web shellcheck à https://shellcheck.net) avant de poster ici. Les questions sur l'utilisation interactive de Bash sont plus susceptibles d'être sur le sujet sur Super User que sur Stack Overflow.