Lorsque vous utilisez LANG=C gcc ...
ce qui se passe, c'est que le shell définit LANG pour gcc
l'environnement uniquement , et non pour l' environnement actuel lui-même ( voir note ). Ainsi, une fois gcc
terminé, LANG
revient à sa valeur précédente (ou non définie).
De plus, lorsque vous l'utilisez, A=10 echo $A
c'est le shell qui remplace $ A, pas echo, et cette substitution (appelée "expansion") se produit avant que l'instruction ne soit évaluée (y compris l'affectation), donc pour fonctionner comme prévu, A
la valeur de doit être déjà définie dans l' environnement actuel avant cette déclaration.
C'est pourquoi A=10 echo $A
ne fonctionne pas comme prévu: A=10
sera défini pour l'écho, mais l'écho ignore en interne la valeur de la variable d'environnement A
. Et $A
est remplacé par la valeur définie dans le shell actuel (qui n'est aucun), puis passé en argument à echo.
Donc , votre hypothèse est correcte: VAR=value command
ne travail, mais cela est pertinent que si l' command
interne utilise VAR. Sinon, vous pouvez toujours passer value
comme argument à command
, mais les arguments sont remplacés par le shell actuel , ils doivent donc être définis avant utilisation:VAR=value; command "$VAR"
Si vous savez comment créer un script exécutable, vous pouvez essayer ceci comme test:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Enregistrez-le sous testscript
et essayez:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Enfin, il vaut la peine de connaître la différence entre les variables shell et d' environnement et les arguments de programme .
Voici quelques bonnes références:
.
(*) Note: techniquement la coquille ne trouve dans l' environnement actuel aussi, et voici pourquoi: Certaines commandes, comme echo
, read
et test
sont builtins shell , et en tant que tels , ils ne fraient pas un processus enfant. Ils fonctionnent dans l'environnement actuel. Mais le shell prend soin que l'affectation ne dure que jusqu'à l'exécution de la commande, donc à toutes fins pratiques, l'effet est le même: l'affectation n'est vue que par cette seule commande.
A=10 (echo $A)
et obtenir10
?