Wenn Sie Online-Tutorials erstellen, die von Leuten in einem einzelnen Terminal verwendet werden können, ist es manchmal gut, Inline-Code als Quelle zu verwenden ... allerdings funktionierte nichts davon wie erwartet. Ich hätte erwartet, foo
dass bei allen davon „Bar“ angezeigt wird. Weiß jemand, warum?
#!/usr/bin/env bash
source <(echo "export foo=bar");
echo "$foo"
source <(cat <<< "export foo=bar");
echo "$foo"
source <(cat <<EOF
export foo=bar
EOF
);
echo "$foo"
Meine einzige Vermutung ist, dass das source
Lesen aus einem Dateideskriptor nicht möglich ist. Ich habe auch versucht, .
anstelle source
desselben zu verwenden.
Ich verwende MacOS, bash --version
Ausgabe:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) Copyright (C) 2007 Free Software Foundation, Inc.
Antwort1
Dies würde in bash
Versionen vor Version 4.0 nicht funktionieren (beispielsweise in der Standardversion bash
von macOS, die Version 3.2.57(1) ist).
Version 4.0 enthielt einen Bugfix:
Ein Fehler wurde behoben, der dazu führte, dass `.' Befehle aus nicht regulären Dateien wie Geräten oder benannten Pipes nicht lesen und ausführen konnte.
(das ist vonhttps://tiswww.case.edu/php/chet/bash/CHANGES)
Die von source
(oder .
) gelesene Datei, wenn Sie sie mit einer Prozessersetzung verwenden, ist keine normale Datei und würde daher den Fehler auslösen, der in Version 4.0 behoben wurde.
Die aktuellste Version ist derzeit die Version 5.0.7(1), in der Ihr Code wie erwartet funktioniert.