Robienie dwóch rzeczy z wyjściem z polecenia

9

Mam program, texcountktóry wyświetla liczbę słów w moim dokumencie LaTeX. Mogę również potokować wyjście tego, aby seddokonać podziału wierszy TeXa na nowe wiersze i zapisać to w pliku, który mogę następnie dołączyć do końcowego dokumentu. Ale kiedy to robię, texcount foo.tex | sed s/$/'\\\\'/ > wc.texwyjście z wiersza poleceń texcountjest pomijane.

Jak mogę uzyskać wynik pierwszego polecenia wyświetlanego w terminalu i przesyłanego potokowo do sed?

Seamus
źródło

Odpowiedzi:

9

Możesz użyć anonimowego potoku dla drugiego polecenia:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
machać
źródło
Zasadniczą częścią tej odpowiedzi jest użycie tee. Jeśli masz pewne powłoki, takie jak Bash, możesz potokować wyjście tee za pomocą >(some further commands). W innych powłokach musisz podać argumentowi tee nazwę pliku (jest to jego standardowy tryb działania), a następnie uruchomić some further commands < thatfile, a następnie usunąć ten plik. Lub zobacz odpowiedź Hari poniżej.
dubiousjim
tee, tee i tee.
bagavadhar
7

Potrzebujesz komendy „tee”, która pozwala dzielić rury.

texcount foo.tex | tee >output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt

To zostawiłoby ci dodatkowy plik output.txt. Przeczytaj to, aby uzyskać więcej informacji: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Możesz także zrobić „man tee”.

Danny Staple
źródło
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedumieszcza zmodyfikowane i niezmodyfikowane wersje danych wyjściowych w dwóch plikach. Jak wydrukować niezmodyfikowaną wersję na terminalu? Próbowałem, tee stdoutale nic nie drukuje ...
Seamus,
3
Nie możesz tego zrobić, ponieważ tee wysyła dane wejściowe do stdout i pliku. Stdout jest tym, co staje się wkładem do sed. Możesz dodać && cat unmodifiedna końcu. Spowoduje to zrzucenie niezmodyfikowanego wyjścia do terminala.
KeithB
Właściwą linią poleceń będzie tutaj texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Lub możesz użyć texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. W obu przypadkach prawdopodobnie będziesz chciał rm output.txtpóźniej.
dubiousjim
@dubiousjim Ten średnik jest poprawny - potok działa, ale średnik lepiej wyraża to, co jest zamierzone.
Danny Staple,
6

Możesz użyć dość idiomatycznego

texcount foo.tex | tee /dev/tty | sed s/$/'\\\\'/ > wc.tex

/dev/tty to magiczne urządzenie, które odnosi się do terminala kontrolnego bieżącego procesu.

Hari
źródło