Czy istnieje sposób, aby przekierować wyjście programu i nadal mieć go na standardowym wyjściu?


24

W porządku. Gdybym chciał przekierować wyjście programu do pliku, zrobiłbym coś takiego

prog > file

Gdybym chciał przekierować zarówno stdout, jak i stderr do tego pliku, zrobiłbym to

prog > file 2>&1

To wszystko dobrze i dobrze, jeśli chcesz, aby dane wyjściowe trafiły do ​​pliku. Ale co, jeśli chcesz, aby dane wyjściowe trafiły do ​​pliku, a jednak nadal do stdout / stderr? Dane wyjściowe są zapisywane w pliku, ale nadal można je zobaczyć w konsoli podczas działania programu. Czy jest na to sposób? A jeśli tak, to w jaki sposób?


Terminologia: Masz na myśli i nadal idziesz do terminalu . stdoutjest deskryptorem pliku 1 i foo > some_fileoznacza, że ​​otwarty deskryptor pliku tylko do zapisu some_filejest standardowym wyjściem foo. stdout zawsze idzie na stdout.
Peter Cordes,

Odpowiedzi:


39

teeistnieje w tym celu; pobiera argument nazwy pliku i zapisuje dane, które odczytuje ze standardowego wejścia, zarówno do standardowego pliku, jak i do pliku:

$ prog 2>&1 | tee file

10
I za dodatkową bash 4 bystrość: prog |& tee file.
Tobu,

1
Możesz także zastąpić „plik” nazwaną rurą ...
Kevin Cantu

@KevinCantu: Nazwany potok jest tylko jednym typem pliku; to jest Uniks, gdzie wszystko jest plikiem. Możesz także prog |& tee /dev/tty > file, co może być przydatne w środku potoku, np. foo |& tee /dev/tty | sed 's/.*\r//' > foo.logZobaczyć aktualizacje postępu linii statusu na twoim terminalu, ale odfiltrować je z pliku dziennika. Lub użyj go do debugowania potoku, który razem hakujesz, pozwalając zobaczyć dane w tym momencie.
Peter Cordes,
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.