Utilisation pratique de l'option `set -k` dans bash

16

Quand utilisons-nous l' set -koption dans bash?

Le manuel de référence de Bash dit,

Tous les arguments sous forme d'instructions d'affectation sont placés dans l'environnement pour une commande, pas seulement ceux qui précèdent le nom de la commande.

Je comprends ce que fait l'option, mais je ne pouvais pas imaginer quand nous en avons besoin.

MS.Kim
la source
Perception correcte. Le -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 ...
Henk Langeveld

Réponses:

14

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.
slm
la source
Dans ce lien, ss64.com/bash/set.html , car set -kils ont d' -o keywordailleurs donné l' -koption. Est-ce que cela signifie quelque chose?
Ramesh
@Ramesh - set -o keywordest la forme longue de set -k. Tu vois help set | grep -- '-k'.
slm
Ah ok. Je me grattais la tête depuis longtemps en essayant de comprendre pourquoi il y avait 2 options. Comme d'habitude réponse parfaite :)
Ramesh
4
./cmd.bash VARCMD=hidoit set -kle faire fonctionner exactement comme le VARCMD=hi ./cmd.bashfait sans set -k. Devinez que la question spécifique du PO porte sur la nécessité pour bash de prendre en charge le ./cmd.bash VARCMD=hiformulaire
iruvar
@ 1_CR - bon point. Je crois que cela a plus à voir avec le style, je vais voir si je peux trouver une vraie source.
slm
8

Toute utilisation pratique de set -kest probablement un style personnel. Certains - peut-être ceux qui aiment les langages de programmation qui offrent la possibilité d'utiliser des arguments de mots clés dans les appels de fonction, ou ces quelques personnes qui aiment la ddsyntaxe de la commande - peuvent préférer

set -k
...
commande var 1 = val 1 var 2 = val 2

à

var 1 = val 1 var 2 = commande
 val 2

La raison réelle pour laquelle l'option existe dans certains shells est expliquée dans la justification de la commande set dans la norme POSIX :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
Mark Plotnick
la source