Quelle est la signification des guillemets simples et doubles dans les variables d'environnement?

19

J'ai défini certaines variables d'environnement dans mon .profile comme ceci:

MY_HOME="/home/my_user"

mais la variable ne semble pas évaluer à moins que je supprime les guillemets et que je ne ressource le fichier. Je crois que les guillemets sont nécessaires s'il y aura des espaces, et des guillemets simples sont utilisés si les échappements ne sont pas souhaités. Quelqu'un peut-il clarifier la signification des guillemets simples et doubles dans les définitions de variables? Et les tiques avant et les tiques arrières?

2NinerRomeo
la source

Réponses:

23

Je pense que vous êtes confus au sujet de la terminologie.

Une "variable d'environnement" est simplement une variable shell dont tout processus enfant héritera.

Ce que vous faites dans votre exemple, c'est de créer une variable shell. Ce n'est pas dans l'environnement jusqu'à ce que vous l'exportiez:

MY_HOME="/home/my_user"
export MY_HOME

met une variable nommée "MY_HOME" dans presque tous les shells (sauf csh, tcsh).

Dans ce cas particulier, les guillemets doubles sont superflus. Ils n'ont aucun effet. Entre guillemets les sous-chaînes de groupe, mais autorise le shell que vous utilisez à effectuer la substitution de variables. Les guillemets simples regroupent les sous-chaînes et empêchent la substitution. Étant donné que votre exemple d'affectation ne contient aucune variable, les guillemets doubles pourraient apparaître comme des guillemets simples.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Il n'y a rien dans l'environnement jusqu'à ce que vous l'exportiez.

Bruce Ediger
la source
18

Variables du shell et variables d'environnement

MY_HOME="/home/my_user"définit la variable shell appelée MY_HOME. Les shells sont des langages de programmation et ont des variables (également appelées paramètres). Après cette affectation, vous pouvez utiliser la valeur de la variable, par exemple avec echo "$MY_HOME".

Les variables de shell sont un concept de shell interne. Lorsque cette instance de shell se termine, MY_HOMEest oublié. Ce que chaque programme connaît et transmet à ses enfants, ce sont les variables d'environnement .

À l'intérieur du shell, les variables d'environnement et les variables de shell fonctionnent de manière très similaire. En réalité, toutes les variables d'environnement que le shell hérite de son parent deviennent des variables de shell. Inversement, une variable shell définie dans un script shell deviendra une variable d'environnement si vous l' exportez .

export MY_HOME="/home/my_user"

Plus de détails que vous pouvez ignorer lors de la première lecture

La raison pour laquelle les variables shell ne deviennent pas automatiquement des variables d'environnement est en partie qu'un script peut accidentellement utiliser un nom de variable significatif pour un programme qu'il lance, et en partie juste historique.

Certains shells très anciens doivent exportêtre utilisés chaque fois que vous modifiez un nom de variable, mais tous les shells modernes gardent une trace des affectations des variables d'environnement, de sorte que l'extrait de code suivant résonne bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

De plus, certains très anciens shells nécessitaient des commandes distinctes pour myvar=fooet export myvar, mais tous les shells modernes le comprennent export myvar=foo.

Vous pouvez exécuter set -ade faire toutes les assignations de variables shell exporter automatiquement la variable, de sorte que myvar=fooéquivaut à export myvar=foosi vous avez exécuté set -adans cette coquille d' abord.

Sur devis

La citation est principalement orthogonale. Si la valeur que vous attribuez à la variable ne contient aucun caractère spécial pour le shell, vous n'avez pas besoin de guillemets. S'il y a des caractères spéciaux, vous devez les protéger avec des guillemets simples ou doubles ou des barres obliques inverses ou une combinaison de ceux-ci. Cela vaut pour la myvar=valuesyntaxe simple et l' exportutilitaire.

Il existe une différence entre la syntaxe d'affectation et la exportsyntaxe. L'interpréteur de commandes étend les résultats des substitutions de variables $foo, en effectuant la division de champ (mot) et l' expansion de nom de chemin (globbing) . Cela signifie que si la valeur de myvarest hello ​ *, alors echo $myvarimprime hellosuivi d'un espace unique suivi de la liste des fichiers dans le répertoire courant. Ceci est presque jamais souhaitable, d' où le principe général à toujours utiliser des guillemets doubles autour de substitutions variables (sauf si vous savez que vous avez besoin PathName l' expansion ou le fractionnement du champ): echo "$myvar". Dans le cas d'une simple cession, othervar=$myvaren fait fiable copie la valeur de myvarlaothervar, car le globbing et le fractionnement de mots sont inhibés dans les affectations (car ils créent plusieurs mots, mais un seul mot est attendu). Cette dispense ne s'applique exportcependant pas. Donc, si vous voulez vous souvenir d'une règle simple, utilisez toujours des guillemets doubles autour des substitutions de variables.

Gilles 'SO- arrête d'être méchant'
la source
Pouvez-vous expliquer "La citation est principalement orthogonale". dans la section "Sur devis"? Je n'ai pas le sens d' orthogonal dans cette phrase.
DK Bose
1
@DKBose Cela signifie que les variables d'environnement vs shell d'une part, et les citations d'autre part, sont deux problèmes distincts qui ont peu à voir l'un avec l'autre. Signification du Wiktionnaire 4 et 5.
Gilles 'SO- arrête d'être méchant'