8 votes

Comment rediriger stdin pour la commande source de bash ?

Je voudrais source un fichier et rediriger STDIN pour cette source. Est-ce possible ?

Exemple, j'ai ce fichier que je souhaite sourcer :

# test.sh
export VALUE=SOMETHING

Cela fonctionne dans un Shell :

> source test.sh
> echo $VALUE
SOMETHING
>

Pourtant, cela ne fonctionne pas

> echo anything | source test.sh
> echo $VALUE

>

Y a-t-il un moyen de faire cela, ou est-ce parce que "source" s'exécute dans le Shell actuel qu'il ne peut pas rediriger STDIN temporairement ?

14voto

John1024 Points 15663

Il y a une bonne raison pour laquelle cela ne fonctionne pas :

echo anything | source test.sh

C'est parce que ce qui précède est un pipeline. Par conséquent, source test.sh s'exécute dans un sous-shell. Cela signifie que toutes les variables d'environnement qu'il crée sont supprimées à la fin de son exécution.

La solution à votre problème est :

 source test.sh < <(echo anything)

Avec cette approche, source test.sh s'exécute dans le Shell principal. Son stdin est redirigé depuis echo anything en utilisant substitution de processus .

Le premier < redirige stdin. La seconde < fait partie de la <(...) qui crée un _substitution de processus_ . Au moins un espace entre le premier et le second < est nécessaire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X