Vous pouvez en principe l'utiliser à tout moment pour "injecter" les variables d'environnement passées dans un script shell (en tant qu'arguments) comme si elles étaient définies dans l'environnement via export, mais sans avoir à les faire résider en permanence dans exportla liste de avant d'exécuter des commandes .
NOTE: Il y a aussi la forme longue du -kcommutateur, set -o keyword.
Exemple
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
Maintenant, si je set -k:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
Mais si je devais simplement exécuter le script ci-dessus:
$ ./cmd1.bash
$
Que fait l'exportation?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
Donc, si nous devions ajouter export | grep VARà notre script comme ceci:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
Et nous avons à nouveau exécuté nos tests ci-dessus:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
Mais sans set -k:
$ ./cmd2.bash
$
Cela set -knous permet également d'exporter temporairement des variables en masse.
Un autre exemple
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
Lorsque nous définissons plusieurs variables, elles sont toutes exportées:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
Alors, c'est juste injecter toutes les variables d'environnement?
Non -kfait une chose très explicite ici. Il s'agit uniquement d'exporter des variables qui étaient incluses sur la ligne de commande lors de l'exécution d'une commande.
Exemple
Disons que j'ai défini cette variable:
$ VARCMD1="hi"
Maintenant, lorsque nous exécutons la même commande en omettant VARCMD1="hi":
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
Mais pourquoi cela existe-t-il?
J'ai trouvé cette source qui explique un peu cette fonctionnalité, intitulée: "Chaînes d'assignation de paramètres de mots clés". REMARQUE: l' URL source utilise une adresse IP, je ne peux donc pas y accéder directement ici sur SE.
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
Lors de la programmation dans n'importe quel langage, la variable et son passage de valeur sont essentiels pour écrire du code fiable. À côté des types de variables d'entier et de tableau, toutes les autres variables de shell acceptent les chaînes comme valeurs. Lorsque nous parlons de langage de programmation shell, pour être cohérent, nous préférons l'expression "paramètre de mot-clé". Voici quelques points à surveiller lors de l'attribution de valeurs aux paramètres de mots clés:
Pour éviter tout effet inattendu, placez toujours la sous-chaîne de paramétrage devant une chaîne de commande.
Dans le shell B, les valeurs assignées des paramètres de mot-clé seront stockées dans des variables de shell (locales). En bash et ksh, les chaînes de paramétrage des mots clés précédant la commande ne seront pas stockées dans les variables shell. Ils n'affectent que le sous-processus immédiat forké pour exécuter la commande en cours. Une ligne de chaînes d'affectation de paramètres de mots clés à elle seule est stockée dans les variables shell (locales). Les chaînes d'affectation de paramètres de mot-clé peuvent également apparaître comme arguments des commandes intégrées d'alias, de déclaration, de composition, d'exportation, de lecture seule et locale. [Section 3.4 du manuel de référence de Bash]
Les chaînes d'affectation de paramètre de mot clé seront traitées comme des arguments pour la commande à exécuter, si elles sont placées après le nom de la commande.
- Les paramètres du mot clé peuvent être manipulés par la commande set.
-knous permet d'exécuter des scripts shell de 30 ans sans avoir besoin de les refactoriser. Passez à la place des variables d'environnement temporaires en utilisant la syntaxe de préfixe:var1=x var2=y command ...