Irgendwie schwierig, das zu nennen ...
Grundsätzlich habe ich ein Programm, das beim Ausführen auf STDOUT eine Reihe von Shell-Variablen druckt:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Ich möchte dies in einem Shell-Skript ausführen, als ob das STDOUT mit ausgewertet würde source
.
Ich würde gerne so etwas machen wie ...
source `./settings`
... aber das funktioniert natürlich nicht.
Ich weiß, ich könnte tun:
./settings >/tmp/file
source /tmp/file
aber das will ich wirklich nicht.
Irgendwelche Hinweise?
sh
- es könnte ein Symlink zu Dash, Ash, Busybox sein ... Ich habe keine Kopie von "the real 'sh'" live gesehen.$( )
- beginnend mit Almquists Shell in 4.3BSD - und es ist auch POSIX. (Anmerkung: nicht streiten, nur neugierig.)Auf Systemen, auf denen
/dev/fd
verfügbar ist, unterstützt bash die Prozessersetzung:Hier
<( )
wird auf einen automatisch zugewiesenen Pfad erweitert, unter/dev/fd/...
dem die Ausgabe von./settings
gelesen werden kann.quelle
Oder natürlich ...
Teste es natürlich ...
Umgang mit Leerzeichen:
quelle
export
Trick funktioniert! Dankea backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Ich denke, / dev / stdin ist eine einzige Linux-Sache.
quelle
/dev/stdin
funktioniert auch bei BSD und Cygwin.|
wird jedoch nicht funktionieren (zumindest nicht genau), da beide Seiten der Pipe separate Unterprozesse sind, sodass Sourcing-Befehle die aktuelle Shell nicht beeinflussen würden./dev/stdin
Trick, aber was Ihre Antwort tut, ist in der Tat gleichbedeutend mit einer Ebene,source ./settings
ohne sie auszuführen. Man könnte ein Here-Dokument verwenden, um dies zu überwinden :source /dev/stdin <<EOF \n $(./settings) \n EOF
.Wollte hier eine andere Perspektive bieten, da die anderen Antworten Dateien erstellen und nicht direkt von stdin ziehen. Ich habe einige Builds, die einige vorbereitete Umgebungsinformationen an mehrere Skripte senden müssen. Ich bereite eine Reihe von Bash-kompatiblen Variablenzuweisungen in einer Zeichenfolge vor:
Wenn ich mich auf die Ausführung des Skripts vorbereite, codiere base64 die obige mehrzeilige Zeichenfolge und leite sie in mein Shell-Skript ein:
In build.sh habe ich aus stdin gelesen, base64 dekodiert und das Ergebnis ausgewertet.
quelle