Comment faire référence à un fichier de variables à l'aide de Bash?
Je veux appeler un fichier de paramètres pour une variable, comment puis-je le faire en bash?
De sorte que le fichier de paramètres de définir les variables (par exemple: CONFIG.FICHIER) :
production="liveschool_joe"
playschool="playschool_joe"
Et le script pour utiliser ces variables dans il
#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Comment puis-je obtenir bash pour faire quelque chose comme ça? Devrai-je utiliser awk/sed etc...?
Vous devez vous connecter pour publier un commentaire.
La réponse courte
Utiliser le
source
commande.Un exemple d'utilisation de
source
Par exemple:
config.sh
script.sh
Noter que la sortie de
sh ./script.sh
dans cet exemple est:C'est parce que le
source
commande s'exécute le programme. Tout enconfig.sh
est exécutée.Une autre façon
Vous pouvez utiliser le haut-
export
de commande et l'obtention et définition des "variables d'environnement" peut aussi l'accomplir.De course
export
etecho $ENV
devrait être tout ce que vous devez savoir à propos de l'accès aux variables. Accéder aux variables d'environnement est fait de la même façon qu'une variable locale.Pour les régler, dire:
à la ligne de commande. Tous les scripts seront en mesure d'accéder à cette valeur.
source
par la tuyauterie dans le contenu plutôt que de fournir un fichier? Commesome command | source
ne fonctionne pas...declare -p
), serait commesomeArray[3]="abc"
, et ainsi de suite...encore plus court à l'aide de la dot:
source
commande pour faire ce clair?Utiliser le
source
commande pour importer d'autres scripts:J'ai le même problème, spécialement dans le cas de la sécurité et j'ai trouvé la solution ici .
Mon problème est que j'ai voulu écrire un script de déploiement en bash avec un fichier de config que le contenu d'un sentier de ce genre.
Existant solution consiste à utiliser la commande "SOURCE" et importer la config-file avec ces variables. "SOURCE chemin/vers/fichier'
Mais cette solution est un problème de sécurité, car le fichier source peut contenir n'importe quoi, un script Bash peut.
Qui crée des problèmes de sécurité. Un malicicios personne peut exécuter du code arbitraire lorsque votre script est sourcing son fichier de configuration.
Imaginer quelque chose comme ceci:
Pour résoudre ce problème, Nous pourrions autoriser uniquement les constructions dans la forme
NAME=VALUE
dans ce fichier (affectation de variable syntaxe) et peut-être des commentaires (si, techniquement, les commentaires sont sans importance). Ainsi, Nous pouvons vérifier le fichier de configuration en utilisantegrep
équivalent de commande degrep -E
.C'est de cette façon que j'ai de résoudre le problème.
CMD="$(rm -fr ~/*)"
.(
et ` " de la finaleCONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(`]*$)"
foo=bar unleash_virus
peut être exécutée. Notefoo=bar\ unleash_virus
,foo="bar unleash_virus"
etfoo=bar #unleash_virus
sont en sécurité. Il n'est pas facile à désinfecter correctement et de ne pas bloquer certains inoffensifs syntaxe de toute façon, surtout quand vous pensez à tous les possible de devis et de s'échapper.en Bash, à la source de certains sortie de la commande, au lieu d'un fichier:
référence
De conversion de fichier de paramètres de variables d'Environnement
D'habitude je vais sur l'analyse au lieu de sourcing, pour éviter la complexité de certains artefacts dans mon fichier. Il offre également me façons de traiter spécifiquement de citations et d'autres choses. Mon principal objectif est de garder tout ce qui vient après le " = " comme un littéral, même les guillemets doubles et les espaces.
Remarque le petit truc que j'ai eu à faire à considérer mon texte cité comme un seul paramètre de l'espace à mon
cntpars
fonction. Il y a un niveau supplémentaire d'évaluation requis. Si je ne ferais pas cela, comme dans l'Option 2, j'aurais passé 2 paramètres comme suit:"value
content"
Double citant au cours de l'exécution d'une commande provoque les guillemets doubles à partir du fichier de paramètres pour être conservés. D'où la 3ème Option échoue également.
L'autre option serait de cours tout simplement pas fournir variables entre guillemets doubles, comme dans l'Option 4, et puis juste pour s'assurer que vous les citer en cas de besoin.
Juste quelque chose à garder à l'esprit.
Recherche en temps réel
Une autre chose que j'aime faire est de faire une recherche en temps réel, évitant l'utilisation de variables d'environnement:
Pas le plus efficace, mais avec de petits fichiers fonctionne très proprement.
Si les variables sont générées et n'est pas enregistré dans un fichier que vous ne pipe dans dans
source
. Le trompeusement simple façon de le faire est: est-cesome command
Le script contenant les variables peuvent être exécutées importées à l'aide de bash.
Envisager l'script-variable.sh
Compte du script où la variable sera utilisée :
src-var
n'est pas un identificateur valide.Pour la prévention des conflits de noms, seulement importer les variables dont vous avez besoin: