Bisher habe ich den folgenden source
Befehl verwendet :
source file_name
Aber was ich versuche zu tun, ist Folgendes:
echo something | source
Welches funktioniert nicht.
Bisher habe ich den folgenden source
Befehl verwendet :
source file_name
Aber was ich versuche zu tun, ist Folgendes:
echo something | source
Welches funktioniert nicht.
Antworten:
Da source
(oder .
) eine Datei als Argument verwendet, können Sie Folgendes versuchen:
source <(echo something)
Ihr Quellbefehl erfordert ein Dateiargument. Sie können dies in einigen Shells durch eine Prozessersetzung erreichen, und das liegt daran, dass die Shell auf die gleiche Weise ...
arg=$(echo hi)
... das echo
Bit dort in der Befehlszeile, das die Ausgabe der Subshell enthält. Im Falle einer Prozessersetzung ersetzt es die Subshell durch eine benannte Datei - normalerweise /dev/fd/62
oder so etwas -, die mit einem Dateideskriptor verknüpft ist. Bei einer Pipe ist der Dateideskriptor 0, also ...
echo 'echo hi' | . /dev/fd/0
... /dev/stdin
oder was auch immer der Fall sein mag, sollte auf jedem Linux-System gut funktionieren - und vielen anderen. Sie können hier-Dokumente auch ähnlich verwenden:
. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI
Sie können wie folgt überprüfen, wie Ihre Shell die Prozessersetzung handhabt:
(set -x; readlink <(:))
... welche druckt (in bash
) :
+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]
... und so können wir sehen, dass die Shell die Ersetzung durchführt und readlink
aus einer anoymischen Pipe liest, die sie im Dateideskriptor 63 öffnet.