Un peu difficile à nommer ...
Fondamentalement, j'ai un programme qui lors de l'exécution imprime sur STDOUT un ensemble de variables shell:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Je veux l'exécuter à partir d'un script shell comme si le STDOUT était évalué avec source
.
J'aimerais faire quelque chose comme ...
source `./settings`
... mais bien sûr, cela ne fonctionne pas.
Je sais que je pourrais faire:
./settings >/tmp/file
source /tmp/file
mais je ne veux vraiment pas faire ça.
Des indices?
sh
trop - cela pourrait être un lien symbolique vers dash, ash, busybox ... Je n'ai pas vu de copie de "the real 'sh'" en direct.$( )
- à commencer par le shell d'Almquist dans 4.3BSD - et c'est POSIX aussi. (Remarque: ne pas discuter, juste curieux.)Sur les systèmes où il
/dev/fd
est disponible, bash prend en charge la substitution de processus:Ici,
<( )
s'étendra à un chemin attribué automatiquement sous/dev/fd/...
lequel la sortie de./settings
peut être lue.la source
Ou bien sûr ...
Testez-le bien sûr ...
Gestion des espaces blancs:
la source
export
astuce fonctionne! Mercia backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Je pense que / dev / stdin est une chose Linux seulement.
la source
/dev/stdin
fonctionne également sur BSD et Cygwin.|
est toutefois pas aller au travail (du moins pas exactement), parce que les deux côtés du tuyau sont séparées des sous - processus, de sorte que les commandes provenant ne seraient pas affecter la coque en cours./dev/stdin
astuce, mais ce que fait votre réponse équivaut en fait à un simplesource ./settings
sans l'exécuter. On pourrait utiliser un ici-document à surmonter ceci:source /dev/stdin <<EOF \n $(./settings) \n EOF
.Je voulais apporter une autre perspective ici, car les autres réponses créent des fichiers et ne tirent pas directement de stdin. J'ai des versions qui doivent envoyer des informations d'environnement préparées à plusieurs scripts. Ce que je fais, c'est préparer un tas d'assignations de variables compatibles Bash dans une chaîne:
Lorsque je me prépare à exécuter le script, j'encode en base64 la chaîne multiligne ci-dessus et la redirige dans mon script shell:
Dans build.sh, j'ai lu depuis stdin, décodé en base64 et évalué le résultat.
la source