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.
tee
Polecenie zapisuje stdin
do 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/null
co 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 cmd
dwó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/null
przekierowania 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 tee
odpowiedzi 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 zsh
instrukcji 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
file1
przez file8
co ich nazwami i są to prawdopodobnie tylko przykładowe zastępcze dla nazw plików
zsh
możesz użyćsome_command >output_log_1 >output_log_2
.