2010-09-24 6 views
3

Je veux définir une variable d'environnement dans bash, qui commence à partir d'un chiffre. L'environnement du processus peut contenir de telles variables (ça ne fait pas attention). Mais dans le shell, vous devez créer les variables, puis les exporter pour qu'elles se retrouvent dans l'environnement. Y a-t-il un moyen de mettre de la valeur dans l'environnement du shell sans toucher aux variables, ou peut-être créer une variable qui commence par un chiffre?bash evironment variables à partir d'un chiffre

+1

OK, je pense que je l'ai trouvé la réponse dans bash-4.1 changelog: Bash passe maintenant les variables d'environnement avec des noms qui ne sont pas valides les noms des variables shell dans l'environnement transmis aux fils fils. Juste besoin de mettre à niveau. – valeryz

+1

On dirait que le changement 4.1 signifie que si j'ai une variable 386 = 1 dans mon processus parent, quand je bifurque, il ne l'efface pas, et il sera disponible pour les enfants. – valeryz

Répondre

2

Les seuls types de caractères de début valides pour les variables bash sont les lettres et les traits de soulignement.

+0

C'est vrai pour les variables. Mais l'environnement de traitement ne s'en soucie pas. Maintenant, comment le mettre là sans restrictions de bash variable? – valeryz

+0

@valeryz: vous devez manipuler l'environnement dans un programme C et utiliser 'execve()' pour le relayer vers bash. Ce n'est pas pratique ou raisonnable. Vous pouvez également créer plusieurs entrées pour une seule variable de cette façon - ce qui n'est pas pratique ou raisonnable non plus. –

0

Pourquoi voulez-vous faire cela? Vous pouvez faire:

export _1="some value" 

ou

export a1="some value" 

La raison pour laquelle vous ne pouvez pas faire ce que vous demandez est qu'une variable comme « $ 1 » serait confondu avec le paramètre de position $1.

+1

Parce que je le fais dans Cygwin pour WinDDK 'build' utilitaire, qui veut une variable '386'. Je comprends les raisons pour lesquelles cela ne fonctionne pas comme vous le dites. – valeryz

4

La seule façon que je pouvais penser était en lançant un nouveau shell en utilisant env:

env 0FOO=BAR /usr/bin/bash 

J'ai essayé sous Cygwin et il semblait travailler.

+0

C'est gentil, merci! J'ai trouvé que je pourrais passer à bash 4.1, mais votre approche devrait fonctionner n'importe où, un processus de bash supplémentaire est bon pour moi. – valeryz

+0

Clever; Je me demande si c'est un bug ou une fonctionnalité dans 'env'. –

+0

Comme le souligne @valeryz, il n'y a pas les mêmes restrictions sur les identifiants dans le bloc d'environnement de processus (IAFAIK - si quelqu'un en a vu, s'il vous plaît commenter) comme il y a dans les variables bash. Puisque env ne viole pas les règles de bash pour les variables bash (il les contourne complètement), cette utilisation me semble cacher. –

0

Le traitement nécessaire est fastidieux et fastidieux et non terriblement sensible, mais (dans les grandes lignes, les contrôles d'erreur sur malloc() omis):

char **env = environ; 
while (*env != 0) 
    *env++; 
char **newenv = malloc((env - environ + 1) * sizeof(*newenv)); 
memcpy(newenv, environ, (env - environ) * sizeof(char *)); 
newenv[env - environ] = "386=pygmalion"; 
newenv[env - environ + 1] = 0; 
char *args[] = { "modded-env-bash", 0 }; 
execve("/bin/bash", args, newenv); 
exit(1); 
+2

Pourquoi putenv() ou setenv() ne fonctionnerait-il pas? – valeryz

+0

Cela nécessite une programmation personnalisée (bien que le nom et la valeur de l'env var puissent être collectés à partir de la ligne de commande), et n'est pas aussi simple que l'utilisation du programme 'env' proposé par Bert F. –

+1

@valeryz: Ils pourraient - ils pourraient ne pas. Il y a une chance décente 'putenv()' fonctionnera, mais cela pourrait vérifier ce que vous fournissez; il y a une chance décente 'setenv()' ne fonctionnera pas car il prend le nom et la valeur séparément et pourrait valider le nom (bien que POSIX ne dise que les signes '=' ne sont pas autorisés, tout le reste semble juste).OK, réécrivez le code pour utiliser 'setenv()' ... amusez-vous. Mieux vaut utiliser la commande 'env' si cela fonctionne là où vous en avez besoin. –

Questions connexes