2009-09-28 20 views
5

Mam program, który czyta ze standardowego wejścia po wywołaniu z wiersza poleceń. Zwykle użytkownik wprowadzałby pewne informacje, naciśnij C-d w nowej linii, aby zasygnalizować koniec pliku, a program przetworzy plik. Następnie użytkownik będzie ponownie monitowany, wprowadzi więcej tekstu i ponownie naciśnij C-d, aby zasygnalizować koniec drugiego pliku.przesyłanie wielu plików ze skryptu powłoki za pomocą standardowego wejścia

Czekam na napisanie skryptu powłoki, który wywoła ten program i automatycznie prześle dwa pliki. Chciałbym zrobić coś takiego:

$ myprogram < file1.txt < file2.txt 

LUB

$ myprogam <file1.txt file2.txt 

sugestie? Używam powłoki bash pod Linuksem.

+0

W jaki sposób użytkownik wskazuje koniec wszystkich plików? Dwie kontrolki D z rzędu? Standardowy projekt dla programów uniksowych to "pliki odczytane w wierszu poleceń, jeśli nie ma takich plików, przetwarzaj standardowe wejście". Jeśli przyjmiesz ten projekt, nie ma problemów; po prostu wywołujesz "myprogram plik1.txt plik2.txt". –

Odpowiedz

3

Oczywiście można użyć cat wysłać dwa pliki w programach standardowe wejście, ale prawdopodobnie nie jest to, co chcesz:

$ cat file1.txt file2.txt | myprogram 

W powyższym przypadku myprogram nie będzie w stanie powiedzieć, gdzie kończy file1.txt i file2.txt rozpoczyna się, chyba że miały określone formatowanie i obserwował strumień dla określonego formatowania, który oznaczał koniec lub początek pliku.

Nie ma standardowego sposobu przesyłania wielu strumieni do standardowego wejścia. Zasadniczo do standardowego wejścia przychodzi tylko jeden strumień.

Prawdopodobnie skonstruowałbyś swój skrypt, aby przyjmował wiele argumentów w wierszu poleceń i wewnętrznie otwierał i przetwarzał je pojedynczo. Oznacza to, że można nazwać go tak:

$ myprogram file1.txt file2.txt 
+0

Być może jest sposób, aby powiedzieć: $ cat file1.txt "EOF" file2.txt , a następnie wiedziałby, że to dwa oddzielne pliki? –

+0

Nie, nie ma sposobu na wysłanie EOF w ten sposób; zobacz moje komentarze do odpowiedzi Pavela Shveda. –

0

Jonathan Leffler mówi w swoim komentarzu, że moje rozwiązanie jest błędne. Może to jest. Właściwie to nie sprawdziłem dokładnie. Ale niech będzie tu tylko informacja, że ​​to zła odpowiedź.


atakujących może echo znak kontrolny z jego polecenia echo. EOF jest C-d, jak już wspomniano, więc użyjmy podpowłoce:

$ (cat file1.txt ; echo -e '\cD' ; cat file2.txt) | myprogram 

ten będzie wykonywał poleceń w nawiasach i rury na wyjściu z nich wszystkich, jak gdyby był to osobny program.

Jeśli nie jesteś pewien, że to rury poprawnie, spróbuj tego:

$ (echo "Hello" ; echo -e '\cD' ; echo "bash") | tee 
+1

Sterowanie-D jest przechwytywane przez sterownik terminala i powoduje, że wysyła on wszystkie oczekujące dane - bez znaków, jeśli nie ma żadnych oczekujących. Program otrzymuje zatem odczyt zerowy, co wskazuje na EOF. Odchylanie literalnych znaków kontrolnych-D w dół potoku nie symuluje tego - nie ma sterownika terminalu, który mógłby pomóc. Właśnie tam pojawia się 'spodziewać się '- używa pseudo-ttys do emulowania terminali. –

2

Czy to ma być 1 wezwanie? Jeśli nie:

for file in file1 file2 file3; do myprogram < $file; done 
0

Napisałem prosty program w języku Python do symulacji zachowania opisywanego programu. W absolutnym minimum, to stawia nas wszystkich w sytuacji mówienia o tym samym, zamiast zakładać, jak działa twój program. (Oczywiście, jeśli twój program nie działa tak, jak to opisuję tutaj, popraw mnie.)

#!/usr/bin/python 

def read_a_file(): 
    print('Type the contents of a file now.') 
    while True: 
     try: 
      s = raw_input('>') 
     except EOFError: 
      break 

read_a_file() 
read_a_file() 
print('We have now read two files. Quitting.') 

można uruchomić ten skrypt, należy wpisać zawartość pierwszego pliku, naciśnij CTRL-D, wpisać zawartość drugiego pliku, naciśnij CTRL-D, a program wychodzi. To wydaje się być zachowanie, które opisujesz.

Moja pierwsza myśl polegała na używaniu, jak sugerował chaos. Jednak nie mogę znaleźć żadnego wsparcia w oczekiwaniu na podłączenie zawartości pliku do procesu. (Zakładam, że zawartość plików jest inna za każdym razem. Jeśli są takie same, to oczekiwanie zadziała, po prostu umieszczając zawartość plików w oczekiwanym skrypcie.)

Muszę zauważyć, że jestem w żadnym wypadku nie oczekuje eksperta; może być na to sposób, który nie jest dla mnie oczywisty.

Moja druga myśl polegała na napisaniu skryptu w języku Python, który uruchomił twój program, i nakarmił go zawartością plików i znaków EOF. Jednak komentarze Jonathana Lefflera sprawiły, że myślałem, że echo znaków EOF nie zadziała.

Moja trzecia myśl jest cholernie kludiasta. Można napisać skrypt, który tworzy skrypt oczekiwany, podłączając zawartość plików do skryptu expect, a następnie wykonując skrypt expect. Podejrzewam, że to zadziała.

Powiązane problemy