225 votes

Passer toutes les variables à partir d'un shell script à l'autre?

Donc disons que j'ai un shell script / script bash nommé test.sh

avec:

#!/bin/bash
#

TESTVARIABLE=hellohelloheloo
./test2.sh

mon test2.sh ressemble à ceci

#!/bin/bash
#

echo ${TESTVARIABLE}

cela ne fonctionne pas. Je ne veux pas passer toutes les variables comme paramètres car à mon humble avis, c'est exagéré. Est-il une manière différente?

306voto

FatalError Points 19772

Vous avez essentiellement deux options:

  1. Faire de la variable une variable d'environnement (export TESTVARIABLE) avant l'exécution de la 2ème script.
  2. Source de la 2ème script, c'est à dire . test2.sh et il sera exécuté dans la même coquille. Ce serait vous permettent de partager des variables plus complexes comme des tableaux facilement, mais signifie également que l'autre script pourrait modifier les variables dans la source de la coquille.

Mise à JOUR:

Pour utiliser export définir une variable d'environnement, vous pouvez soit utiliser une variable existante:

A=10
# ...
export A

Cela devrait fonctionner dans les deux bash et sh. bash permet également d'être combinées comme suit:

export A=10

Cela fonctionne aussi dans mon sh ( bash, vous pouvez utiliser echo $SHELL le vérifier). Mais je ne crois pas que cela est garanti de fonctionner dans tous sh, donc il vaut mieux jouer la sécurité et de les séparer.

Toute variable de l'exportation de cette façon, il sera visible dans les scripts que vous exécuter, par exemple:

un.sh:

#!/bin/sh

MESSAGE="hello"
export MESSAGE
./b.sh

b.sh:

#!/bin/sh

echo "The message is: $MESSAGE"

Alors:

$ ./a.sh
The message is: hello

Le fait que ces deux scripts shell est également à quelques accessoires. Les variables d'environnement peuvent être transmises à des processus à exécuter, par exemple, si nous avons utilisé python au lieu de cela, il pourrait ressembler à:

un.sh:

#!/bin/sh

MESSAGE="hello"
export MESSAGE
./b.py

b.py:

#!/usr/bin/python

import os

print 'The message is:', os.environ['MESSAGE']

Sourcing:

Au lieu de cela, nous pourrions source comme ceci:

un.sh:

#!/bin/sh

MESSAGE="hello"

. ./b.sh

b.sh:

#!/bin/sh

echo "The message is: $MESSAGE"

Alors:

$ ./a.sh
The message is: hello

Cette plus ou moins "importations" le contenu de b.sh directement et l'exécute dans la même coquille. Notez que nous n'avons pas d'exporter la variable d'y accéder. Cette implicitement les actions de toutes les variables que vous avez, ainsi que l'une permet à l'autre de script pour ajouter/supprimer/modifier des variables du shell. Bien sûr, dans ce modèle à la fois vos scripts doivent être de la même langue (sh ou bash). Pour donner un exemple de la façon dont nous pourrions passer des messages en arrière et en avant:

un.sh:

#!/bin/sh

MESSAGE="hello"

. ./b.sh

echo "[A] The message is: $MESSAGE"

b.sh:

#!/bin/sh

echo "[B] The message is: $MESSAGE"

MESSAGE="goodbye"

Alors:

$ ./a.sh
[B] The message is: hello
[A] The message is: goodbye

Ceci fonctionne aussi bien en bash. Il rend également facile de partager des données plus complexes que vous ne pouvez exprimer comme une variable d'environnement (au moins sans soulèvement d'objets lourds sur votre partie), comme des tableaux ou des tableaux associatifs.

19voto

striking Points 93

Il y a en fait un moyen plus facile que l'exportation et la suppression ou l'approvisionnement de nouveau (au moins dans bash, aussi longtemps que vous êtes ok avec passant les variables d'environnement manuellement):

laissez un.sh être

#!/bin/bash
secret="winkle my tinkle"
echo Yo, lemme tell you \"$secret\", b.sh!
Message=$secret ./b.sh

et b.sh être

#!/bin/bash
echo I heard \"$Message\", yo

Output observé est

[rob@Archie test]$ ./un.sh
Yo, crois-moi vous dire "winkle mon tinter",
b.sh! J'ai entendu "winkle mon tinter", yo

La magie réside dans la dernière ligne de l' a.shMessage, uniquement pour la durée de l'invocation de l' ./b.sh, est fixé à la valeur de secret de a.sh. En gros, c'est un peu comme les paramètres nommés/arguments. Plus que cela, cependant, il fonctionne même pour des variables comme l' $DISPLAY, les contrôles Serveur X une application démarre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X