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.

Antworten:


38

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

source <(echo something)

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.