skrót do podawania zawartości wielu plików do standardowego skryptu

20

Powiedzmy, że mam skrypt o nazwie script, który czyta stdini 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?

0x4B1D
źródło
Przełącz się na, zsha będziesz mógł biegać cmd <file1 <file2 ... <fileN;)
don_crissti

Odpowiedzi:

20

Możesz użyć cati potoku:

cat file1 file2 file3 ... fileN | ./script

Twój przykład, używając potoku i bez pliku tymczasowego:

join file1.txt file2.txt | ./script
Bruce Ediger
źródło
Nie. To takie proste, że nawet nie jestem pewien, jak sam tego nie zdawałem sobie sprawy. Dzięki!
0x4B1D
10
Przydatne wykorzystanie nagrody kota!
glenn jackman
4
@Bruce Ediger: Zakładam, że właśnie wskazałeś sposób użycia joinbez pliku tymczasowego, ale po to, aby wyjaśnić czytelnikowi: cat f1 f2nie wytwarza tego samego wyniku, cojoin f1 f2
Peter.O
@ dziękuję Fredowi za zwrócenie na to uwagi - użyłem jointego przykładu, ponieważ bawiłem się nim wcześniej; w rzeczywistości, na przykład, którego użyłem cat.
0x4B1D
10

Jeśli nie chcesz używać potoku, możesz użyć przekierowania wejściowego z podstawieniem procesu:

./script <(cat file1 file2)
Jonah Braun
źródło
3

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 URLpomocą curllub podobnego narzędzia.

Coś takiego można wykorzystać do uzyskania stdoutwielu 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:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Teraz przetestuj:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Wynik:

process 1
process 2
process 3

<()zamienia proces w wirtualny fileprzy użyciu, fdjeśli chcesz, więc <trzeba go przeczytać. catsam tego nie potrzebuje, ponieważ robi to, co robi, łączy pliki, wirtualne lub rzeczywiste.

sdkks
źródło