Powiedzmy, że mam skrypt o nazwie script
, który czyta stdin
i wyrzuca niektóre wyniki na ekran.
Gdybym chciał nakarmić go zawartością jednego pliku, napisałbym:
$ ./script < file1.txt
Ale co jeśli chcę przesłać zawartość wielu plików do skryptu w ten sam sposób, czy to w ogóle możliwe? Do tej pory najlepiej wymyśliłem:
cat file1.txt file2.txt > combined.txt && ./script < combined.txt
Który używa dwóch poleceń i tworzy plik tymczasowy. Czy istnieje sposób na zrobienie tego samego, z pominięciem tworzenia połączonego pliku?
bash
shell
scripting
io-redirection
0x4B1D
źródło
źródło
zsh
a będziesz mógł biegaćcmd <file1 <file2 ... <fileN
;)Odpowiedzi:
Możesz użyć
cat
i potoku:Twój przykład, używając potoku i bez pliku tymczasowego:
źródło
join
bez pliku tymczasowego, ale po to, aby wyjaśnić czytelnikowi:cat f1 f2
nie wytwarza tego samego wyniku, cojoin f1 f2
join
tego przykładu, ponieważ bawiłem się nim wcześniej; w rzeczywistości, na przykład, którego użyłemcat
.Jeśli nie chcesz używać potoku, możesz użyć przekierowania wejściowego z podstawieniem procesu:
źródło
Aby dodać odpowiedź @Jonah Braun, jeśli kiedykolwiek będziesz musiał dodać dane wyjściowe procesu do skryptu, tzn. Plik może nie znajdować się na dysku, ale można uzyskać do niego dostęp za
URL
pomocącurl
lub podobnego narzędzia.Coś takiego można wykorzystać do uzyskania
stdout
wielu procesów i użycia ich w skrypcie za pośrednictwemstdin
Będzie to skrypt do obsługi danych wejściowych Zawartość
multi-input.sh
:Teraz przetestuj:
Wynik:
<()
zamienia proces w wirtualnyfile
przy użyciu,fd
jeśli chcesz, więc<
trzeba go przeczytać.cat
sam tego nie potrzebuje, ponieważ robi to, co robi, łączy pliki, wirtualne lub rzeczywiste.źródło