2015-10-08 2 views
0

J'ai un programme C et un script shell et je voudrais script shell « source » en utilisant mon C.Comment "source" un fichier shell dans C?

J'ai essayé l'utilisation du système () fonction, après je peux exécuter le script correctement, mais mon les couleurs ne fonctionnent pas. Par exemple au lieu de CYAN - je l'ai défini comme:

CYAN='\e[96m' 

il ne montre que \ e [96m et certaines fonctions vient d'échouer avec le message:

./myscript.sh: 27: [: y: unexpected operator 

Y at-il une solution?

+0

Problèmes avec les paramètres de votre terminal? Votre script fonctionne-t-il correctement? –

+0

note: "sourcing" dans ce contexte n'a aucun sens. Voulez-vous * exécuter * le script? –

+0

Pourriez-vous être plus précis? Quand je source le script shell normalement à partir du terminal "source ./myscript.sh" tout fonctionne correctement. Oui, je veux exécuter le script. Mais comme: "./script.sh" ou "source ./script.sh", en utilisant le programme C. – Yeez

Répondre

1

Un programme qui n'est pas lui-même le shell ne peut pas "générer" un fichier de commandes shell comme peut le faire le shell lui-même. Un programme peut exécuter un tel fichier en tant que script, directement ou en invoquant un shell pour l'exécuter, mais le script obtient alors son propre environnement et toutes les modifications qu'il applique à cet environnement ne se propagent pas à l'environnement du processus parent.

Les programmes reçoivent leur environnement en fonction du démarrage du programme. Si vous voulez qu'une variable soit définie dans l'environnement d'un programme, la chose la plus simple à faire est de l'organiser quand le programme est appelé, soit en l'exportant de l'environnement du processus parent, soit en enveloppant le programme dans un script cela arrange pour le même. Il existe également des alternatives supplémentaires au démarrage du processus.

Si un programme C veut modifier son environnement après démarrage, il peut utiliser les fonctions setenv() et unsetenv(). Ceux-ci sont définis par POSIX, pas par C lui-même, mais si nous parlons de l'origine des commandes shell, il semble raisonnable de supposer un contexte POSIX. En outre, si vous essayez de définir CYAN comme une variable de shell dont le contenu est une séquence d'échappement ANSI, votre syntaxe est incorrecte. Aucune séquence d'échappement n'est reconnue dans les guillemets simples ordinaires (même une guillemets fermante ne peut pas être échappée). Dans les doubles guillemets, la barre oblique inverse fonctionne comme un caractère d'échappement, mais dans un sens strict: les codes de caractères de style C ne sont pas pris en charge ici. Si, encore une fois, vous traitez que dans la coquille, par opposition à C, alors vous semblez vouloir

CYAN=$'\e[96m' 

(Notez le $, ce qui est essentiel pour \e d'être reconnu comme représentant la « fuite » caractère, et qui amène le shell à reconnaître également quelques autres séquences d'échappement de style C.)

+0

J'avais peur que tu dises ça. Donc en d'autres termes, c'est impossible? Et je dois utiliser des fonctions telles que setenv(), unsetenv(). – Yeez

+0

@Yeez, il est impossible pour un processus de modifier l'environnement d'un processus différent, sauf dans la mesure où un processus parent contrôle l'environnement * initial * de tout processus enfant généré.L'implémentation C du shell lui-même utilise 'setenv()' pour gérer les affectations de variables telles que vous l'avez demandé. –

+0

Ok, alors il est maintenant temps de le réécrire en C. Merci beaucoup pour votre temps et bonne explication. – Yeez