Voici un problème: strong> dans mes scripts Bash, je veux créer plusieurs fichiers avec quelques chèques, donc j'ai: p> Naïvement j'ai essayé de créer une fonction qui fait: p> mais il y a un accrochage là-bas. P> Si l'un des fichiers - il deviendra efficacement: P> foo , bar code>, etc. Avoir un global tel que - p> function safe_source() {
# ...
declare GLOBAL_VAR=42
# ...
}
3 Réponses :
Vous pouvez définir les valeurs de vos variables dans les fonctions et faire le déclarer code> à l'intérieur d'une fonction rend la variable locale à cette fonction. Exporter CODE> affecte l'environnement des processus enfants non pas des environnements actuels ou parents. P>
declare -r code>, déclarer -i code> ou déclarer -ri code> après le fait. p>
Oui, la commande «eval» de Bash peut faire ce travail. «Eval» n'est pas très élégant et peut parfois être difficile à comprendre et à déboguer le code qui l'utilise. J'essaie habituellement de l'éviter, mais Bash vous laisse souvent sans autre choix (comme la situation qui a motivé votre question). Vous devrez peser les avantages et les inconvénients d'utiliser «Eval» pour vous-même.
Si vous n'êtes pas familier avec "eval", c'est une bash construite en commande qui vous attend de que vous transmettez une chaîne comme paramètre. «Eval» interprète de manière dynamique et exécute votre chaîne comme une commande à part entière, dans le contexte et la portée du shell actuel. Voici un exemple de base d'une utilisation commune (affectation de variable dynamique): p> Voir le Guide de script Bash avancé pour plus d'informations et des exemples: http://tldp.org/ldp/abs/html/internal.html#evalref p> < H3> Résoudre votre problème "Source" h3> pour faire "EVAL" gérer votre problème d'approvisionnement, vous commenceriez en réécrivant votre fonction, "Safe_Source ()". Au lieu d'exécuter la commande, 'Safe_source ()' doit simplement imprimer la commande comme une chaîne sur stdout: p> aussi, vous devez modifier vos invocations de fonction, Légèrement, pour exécuter réellement la commande "eval": p> (ce sont des backticks / backticotes, BTW.) P> en bref: p> C'est une sorte de complexe. Comme je l'ai dit, 'eval' n'est pas exactement élégant. En particulier, il y a quelques éléments spéciaux que vous devriez remarquer sur les modifications que nous avons apportées: p> La plupart de ces changements sont motivés par le fait que «eval» ne gérera pas de nouvelles lignes. Il ne peut traiter que de multiples commandes si nous les combinons dans une seule ligne délimitée par des points-virgules, à la place. Les pauses de la nouvelle fonction sont purement une commodité de formatage pour l'œil humain. P> Si l'une de celles-ci n'est pas claire, exécutez votre script avec le drapeau de Bash '-X' (exécution de débogage) allumé, et cela devrait donner vous une meilleure image de exactement ce qui se passe. Par exemple, dans le contexte de la fonction, la fonction produit la chaîne de commande 'eval' en exécutant cette commande: p> puis, dans le contexte principal, le script principal exécute ceci. : p> Enfin, à nouveau dans le contexte principal, la commande EVAL exécute ces deux commandes s'il existe: p> bien chance. p> p> Comment ça marche h3>
C'est une réponse en retard, mais maintenant Si vous avez besoin d'une variable globale (lecture exportée), utilisez: p> déclarer code> prend en charge le paramètre -g code>, qui fait une variable globale (lorsqu'elle est utilisée à l'intérieur de la fonction). Mêmes travaux dans le fichier source.
Peut-être que cela fonctionne si vous utilisez
exporter code> au lieu dedéclarer code>?Je simplifiais. En fait, j'ai utilisé
declare -r code> (lecture en lecture seule), et parfoisdéclarer -ri code> (lecture seule, entier). Lorsque je dépose ledéclarer code> Les choses fonctionnent bien, je peux également utiliserlisonly code> en cas de besoin, mais je ne trouve pas d'alternative àdéclarer - -Je code> . BTW,déclarer -x code> à l'intérieur d'une fonction est toujours un local.Avez-vous vraiment besoin d'utiliser
déclarer -i code> est son utilisation immuable? Je pourrais envisager de simplement l'ignorer, car je suis tout à fait sûr qu'il n'y a pas de solution pour ce que vous essayez de réaliser avecdéclarer code> :)Je pense que vous voulez dire que (Python, Perl, Ruby) rendrait votre Life i> pas fichier i> plus facile, et je pense que vous vouliez nommer votre fonction coffre-fort i > Pas Enregistrer i> Source () :) Un effet secondaire de Red Bull, peut-être?