Polecenie źródła źródła za pomocą potoku

25

Wcześniej używałem następującej sourcekomendy:

source file_name

Ale staram się to zrobić:

echo something | source

Co nie działa

Desmond Hume
źródło

Odpowiedzi:

38

Ponieważ source(lub .) przyjmuje plik jako argument, możesz spróbować:

source <(echo something)
muru
źródło
1
To działało, dziękuję. I szczęśliwego Nowego Roku!
Desmond Hume,
@muru To działa świetnie. Zauważ, że "| source / dev / stdin" wygląda na działające, ale faktycznie upuści wszystkie przypisania zmiennych. Nie pewny dlaczego. Wydaje się solidny w teorii. To szaleństwo.
Dustin Oprea
2
Potoki @DustinOprea tworzą podpowłokę, więc wszystkie te przypisania zmiennych nigdy nie wpływają na powłokę nadrzędną.
mur
8

Twoje polecenie źródłowe wymaga argumentu pliku. Możesz to uzyskać w niektórych powłokach z podstawieniem procesu, a to dlatego, że w ten sam sposób powłoka zastępuje ...

arg=$(echo hi)

... echobit w wierszu poleceń z wyjściem podpowłoki, w przypadku podstawienia procesu zastępuje podpowłokę nazwanym plikiem - zwykle /dev/fd/62lub czymś - linkiem do deskryptora pliku. W przypadku potoku deskryptor pliku wynosi 0, więc ...

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

... /dev/stdinlub cokolwiek by nie było, powinno działać dobrze na każdym systemie linux - i wielu innych oprócz. Możesz także użyć tutaj dokumentów w podobny sposób:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

Możesz sprawdzić sposób, w jaki twoja powłoka radzi sobie z podstawieniem procesów, w następujący sposób:

(set -x; readlink <(:))

... który drukuje (w bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... i widzimy, że powłoka dokonuje podstawienia i readlinkczyta z anonimowego potoku, który otwiera na deskryptorze pliku 63.

mikeserv
źródło