Lorsque vous utilisez LANG=C gcc ... ce qui se passe, c'est que le shell définit LANG pour gccl'environnement uniquement , et non pour l' environnement actuel lui-même ( voir note ). Ainsi, une fois gccterminé, LANGrevient à sa valeur précédente (ou non définie).
De plus, lorsque vous l'utilisez, A=10 echo $Ac'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, Ala valeur de doit être déjà définie dans l' environnement actuel avant cette déclaration.
C'est pourquoi A=10 echo $Ane fonctionne pas comme prévu: A=10sera défini pour l'écho, mais l'écho ignore en interne la valeur de la variable d'environnement A. Et $Aest 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' commandinterne utilise VAR. Sinon, vous pouvez toujours passer valuecomme 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 testscriptet 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, readet testsont 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?