Odpowiedzi:
Zobacz man tee:
NAZWA: tee - odczyt ze standardowego wejścia i zapis do standardowego wyjścia i plików
SKŁADNIA: tee [OPCJA] ... [PLIK] ...
Odpowiednio:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2 próbowałem wykonać jak wyżej, ale muszę nacisnąć ctrl-c, aby przekierować go do drugiego pliku dziennika. również wyjście jest drukowane na konsoli. Chcę, aby dane wyjściowe polecenia były przekierowywane do dzienników, ale nie do konsoli. każda pomoc jest doceniana.
teePolecenie zapisuje stdindo pliku (ów), a także do stdout. Jeśli nie chcesz, aby dane wyjściowe pojawiały się na terminalu, musisz przekierować do tego, /dev/nullco zwykle.
echo test | tee --append file1 file2
Załóżmy, że dane wyjściowe są generowane z funkcji cmd():
cmd() {
echo hello world!
}
Aby przekierować wyjście z cmddwóch plików, ale nie do konsoli, możesz użyć:
cmd | tee file1 file2 >/dev/null
Będzie to działać dla wielu plików, biorąc pod uwagę wszelkie źródła danych przesyłane do tee:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Będzie to również działać:
echo $(cmd) | tee file1 file2 >/dev/null
Bez /dev/nullprzekierowania tee wyśle wyjście na standardowe wyjście oprócz podanych plików.
Na przykład, jeśli uruchomisz to z konsoli, zobaczysz tam wyjście. Uruchom z crontab, na wyjściu pojawi się komunikat o stanie, który zostanie wysłany do Ciebie (patrz również odpowiedź Gillesa tutaj https://unix.stackexchange.com/a/100833/3998 ).
To działało dla mnie w bash na Ubuntu 12.04 i zostało zweryfikowane w Ubuntu 14.04 przy użyciu GNU bash 4.3.11 (1), więc powinno działać na każdej najnowszej wersji bash GNU.
version 4.3.11(1)-release (i686-pc-linux-gnu)) w Ubuntu 14.04.
To stary post, ale właśnie go znalazłem ...
Zamiast przekierowywać dane wyjściowe > /dev/null, możesz przekierować je do ostatniego pliku:
echo "foobarbaz" | tee file1 > file2
Lub do dołączenia wyniku:
echo "foobarbaz" | tee -a file1 >> file2
-a tee)
Jak @jofel wspomniał w komentarzu pod odpowiedzią, można to zrobić natywnie w zsh:
echo foobar >file1 >file2 >file3
lub z rozszerzeniem nawiasu klamrowego:
echo foobar >file{1..3}
Wewnętrznie działa to bardzo podobnie do teeodpowiedzi podanych powyżej. Powłoka łączy stdout polecenia z procesem, który potokuje do wielu plików; w związku z tym, nie ma żadnych istotnych zaletą techniczną robi to w ten sposób (ale to ma wyglądać naprawdę dobrze). Więcej informacji znajdziesz w zshinstrukcji obsługi .
Nie można jednak skomentować innego sposobu wyrażenia
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Można to uprościć w przypadku wielu plików.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1przez file8co ich nazwami i są to prawdopodobnie tylko przykładowe zastępcze dla nazw plików
zshmożesz użyćsome_command >output_log_1 >output_log_2.