Wcześniej używałem następującej source
komendy:
source file_name
Ale staram się to zrobić:
echo something | source
Co nie działa
Wcześniej używałem następującej source
komendy:
source file_name
Ale staram się to zrobić:
echo something | source
Co nie działa
Odpowiedzi:
Ponieważ source
(lub .
) przyjmuje plik jako argument, możesz spróbować:
source <(echo something)
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)
... echo
bit w wierszu poleceń z wyjściem podpowłoki, w przypadku podstawienia procesu zastępuje podpowłokę nazwanym plikiem - zwykle /dev/fd/62
lub czymś - linkiem do deskryptora pliku. W przypadku potoku deskryptor pliku wynosi 0, więc ...
echo 'echo hi' | . /dev/fd/0
... /dev/stdin
lub 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 readlink
czyta z anonimowego potoku, który otwiera na deskryptorze pliku 63.