Och, chłopcze, to ma sens! Walczę z tym od ostatniej godziny i wreszcie rozumiem, dziękuję wam.
Aby zapewnić alternatywę pracy dla oryginalnego programu, można zrobić coś takiego:
$ echo hello | python <(cat <<END
import sys
for line in sys.stdin:
print line
END
)
Ale uważaj! Jeśli umieścisz to w pliku, ostateczna END
musi dotykać lewej rynny (bez białych znaków). W przeciwnym razie nie będzie analizować "nieoczekiwanego końca pliku podczas szukania pasującego znaku" lub czegoś podobnego (w rzeczywistości zajęło mi to dwie godziny, zanim zacząłem odpowiadać).
Wyjaśniając ten kod, co się dzieje, jest to, że <<END ... END
połączeniu z <(cat ...)
utworzyć plik (w /dev/fd
) tak, że może być podawany do python
, jak gdyby był prawdziwym plikiem. Cytowanie this objaśnienie o <(...)
:
Jest to podstawienie procesu. Przesyła dane wyjściowe polecenia do formatu FIFO, który można odczytać z normalnego pliku.
Jest jeszcze jedna ciekawa odpowiedź na ten temat here.
To innowacyjne, ale nadal zasadniczo [bezużyteczny użycie 'cat'] (http://www.iki.fi/era/unix/award.html). Powłoka nie potrzebuje pomocy "cat" w podstawianiu procesu, aby przekazać tutaj dokument do Pythona, chociaż konstrukcja nie wiąże się ze standardowym wejściem (powłoka w zasadzie sprawia, że wyjście z substytucji procesu jest dostępne jako nazwany tymczasowy plik) . – tripleee