web-dev-qa-db-fra.com

Définir une variable d'environnement pour les sous-espions

Je sais que je peux exécuter une commande avec une variable d'environnement comme celle-ci:

FOO=bar mycommand

Je sais que je peux exécuter des commandes dans un sous-vase comme ceci:

(firstcommand && secondcommand)

Mais puis-je combiner ces deux?

FOO=bar (firstcommand && secondcommand)

donne:

sh: syntax error: unexpected "("

au moins dans Shellbox Shell (Ash).

éditer : Kusalananda suggérée FOO=bar sh -c 'first && second' qui est en effet une solution. Cependant, je suis également intéressé par des réponses alternatives, car j'aime la syntaxe des sous-espaces, car elle ne nécessite pas de violer avec échappement de citations.

9
AndreKR

Une manière:

FOO=bar sh -c 'first && second'

Ceci définit la variable d'environnement FOO pour la commande unique sh.

Pour définir plusieurs variables d'environnement:

FOO=bar BAZ=quux sh -c 'first && second'

Une autre façon de faire ceci est de créer la variable et export it à l'intérieur d'un sous-vase. Faire le export à l'intérieur du sous-groupe garantit que la coque extérieure n'obtient pas la variable dans son environnement:

( export FOO=bar; first && second )

Résumation des commentaires: le export est nécessaire pour créer une variable d'environnement (par opposition à une variable de coquille). La chose avec les variables d'environnement est qu'ils sont hérités par les processus d'enfants. Si first et second sont des utilitaires externes (ou des scripts) qui regardent leur environnement, ils ne verraient pas la variable FOO sans le export.

11
Kusalananda