563 votes

La définition d'une variable d'environnement avant une commande en Bash ne fonctionne pas pour la deuxième commande dans un pipe

Dans un shell donné, je dois normalement définir une ou plusieurs variables, puis exécuter une commande. Récemment, j'ai découvert le concept de l'ajout d'une définition de variable à une commande :

FOO=bar somecommand someargs

Cela fonctionne... en quelque sorte. Cela ne fonctionne pas lorsque vous changez une variable LC_* (ce qui semble affecter la commande, mais...). no ses arguments, par exemple, les plages de caractères '[a-z]') ou lorsqu'on envoie la sortie vers une autre commande de cette manière :

FOO=bar somecommand someargs | somecommand2  # somecommand2 is unaware of FOO

Je peux également faire précéder somecommand2 de "FOO=bar", ce qui fonctionne, mais ajoute une duplication indésirable, et n'aide pas avec les arguments qui sont interprétés en fonction de la variable (par exemple, '[a-z]').

Alors, quel est le meilleur moyen de faire cela sur une seule ligne ?

Je pense à quelque chose de l'ordre de :

FOO=bar (somecommand someargs | somecommand2)  # Doesn't actually work

J'ai eu beaucoup de bonnes réponses ! L'objectif est de faire en sorte que cela reste une ligne simple, de préférence sans utiliser "export". La méthode utilisant un appel à Bash était la meilleure dans l'ensemble, bien que la version entre parenthèses avec "export" était un peu plus compacte. La méthode consistant à utiliser une redirection plutôt qu'un pipe est également intéressante.

2 votes

(T=$(date) echo $T) fonctionnera

0 votes

Dans le cadre de scripts multiplateformes (y compris Windows) ou de projets basés sur npm (js ou autre), vous pouvez jeter un coup d'œil à l'outil de gestion de l'identité de l'utilisateur. module cross-env .

12 votes

J'espérais que l'une des réponses expliquerait aussi pourquoi cela ne fonctionne qu'en quelque sorte, c'est-à-dire que ce n'est pas équivalent à l'exportation de la variable avant l'appel.

9voto

chepner Points 54078

La redirection du processus (si elle est disponible) devrait également fonctionner.

FOO=bar somecommand2 < <(somecommand someargs)

-6voto

Spencer Rathbun Points 6171

Utiliser un shell script :

#!/bin/bash
# myscript
FOO=bar
somecommand someargs | somecommand2

> ./myscript

22 votes

Vous avez toujours besoin export ; sinon $FOO sera une variable de l'interpréteur de commandes, pas une variable d'environnement, et ne sera donc pas visible pour somecommand o somecommand2 .

1 votes

Cela fonctionnerait mais irait à l'encontre de l'objectif d'avoir une commande d'une ligne (j'essaie d'apprendre des moyens plus créatifs d'éviter les multi-lignes et/ou les scripts pour des cas relativement simples). Et ce que @Keith a dit, bien qu'au moins l'exportation resterait dans la portée du script.

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