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?

Odpowiedzi:


9

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

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)

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”.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.