Quellbefehl mit einer Pipe zuführen

25

Bisher habe ich den folgenden sourceBefehl verwendet :

source file_name

Aber was ich versuche zu tun, ist Folgendes:

echo something | source

Welches funktioniert nicht.

Desmond Hume
quelle

Antworten:

38

Da source(oder .) eine Datei als Argument verwendet, können Sie Folgendes versuchen:

source <(echo something)
muru
quelle
1
Das hat funktioniert, danke. Und ein frohes neues Jahr!
Desmond Hume
@muru Das funktioniert super. Beachten Sie, dass „| Quelle / dev / stdin“ hat das Aussehen der Arbeit, aber es wird tatsächlich alle der Variablenzuweisungen fallen. Nicht sicher warum. Scheint solide in der Theorie. Es ist Wahnsinn.
Dustin Oprea
2
@DustinOprea-Pipes erstellen eine Subshell, sodass sich all diese Variablenzuweisungen nie auf die übergeordnete Shell auswirken.
muru
8

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 echoBit 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/62oder so etwas -, die mit einem Dateideskriptor verknüpft ist. Bei einer Pipe ist der Dateideskriptor 0, also ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinoder 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 readlinkaus einer anoymischen Pipe liest, die sie im Dateideskriptor 63 öffnet.

mikeserv
quelle