Jaki jest cel „tee”?

90

Wszystkie zastosowania, teejakie kiedykolwiek widziałem, były takie:

 do_something | tee -a logfile

Lub:

do_something_else | tee logfile

Czy został teewymyślony dla tych, którzy nie wiedzą, że możesz zrobić to samo z przekierowaniami potoku powłoki? Jak na przykład:

do_something >> logfile

Lub:

do_something_else > logfile

Jest praktycznie taki sam i wymaga mniejszej liczby naciśnięć klawiszy na klawiaturze. W jakich ukrytych funkcjach nie widzę tee?

R Moog
źródło
62
Jak nie odpowiedział na to pierwszy wiersz strony podręcznika „... i zapis na standardowe wyjście i pliki” ? Odpowiedzi są interesujące, ale ogólnie mówiąc o tym, jak fajne są rury, tylko podkreśla, że ​​to Q wydaje się zbyt szerokie i być może powinno być zamknięte.
Xen2050,
3
@ Xen2050 Nie można winić pytania za zbyt szeroką odpowiedź. Pytanie jest bardzo szczegółowe, podobnie jak obecnie najwyżej oceniana odpowiedź .
Jon Bentley,
1
@JonBentley pytanie nie brzmi jak „konkretny problem z wystarczającą ilością szczegółów, aby zidentyfikować odpowiednią odpowiedź” (jak czytamy w oknie dialogowym). Brzmi to tak: „jeśli na twoje pytanie można odpowiedzieć całą książką lub ma wiele ważnych odpowiedzi (ale nie ma sposobu, aby ustalić, które - jeśli w ogóle - są poprawne), to prawdopodobnie jest ono zbyt szerokie dla naszego formatu”. (Źródło: Centrum pomocy )
Xen2050,
4
@ Xen2050 Czy czytamy to samo pytanie? Wydaje mi się to bardzo specyficzne - jaka jest różnica między trójnikiem a rurami? Odpowiedzi na nie udzieliły dwa zdania. Daleko od całej książki. Fakt, że niektóre odpowiedzi wybierają styczną, nie ma nic wspólnego z zakresem pytania.
Jon Bentley,
@JonBentley: Czy czytamy to samo pytanie? R Moog rodzaj-of sort-of zakłada dość dobrze ukierunkowany pytanie - jaka jest różnica między tee i I / O przekierowania ?   Fakt, że mówi „ przekierowania potoku powłoki, takie jak i ”, nie jest na korzyść tego argumentu i jest argumentem za jego zamknięciem jako niejasnym. Ale w rzeczywistości zadaje wiele pytań: „Jaki jest cel ?”, „ Został wymyślony dla tych, którzy nie wiedzą, że możesz zrobić to samo z przekierowaniami potoku powłoki” i „Jakie ukryte funkcje nie widzę ?”. Co najmniej dwa z tych pytań są zbyt ogólne. >>>teeteetee
G-Man,

Odpowiedzi:

242

Co ty nie widzisz, że do_something | tee -a logfilestawia na wyjście logfile i standardowe wyjście, gdy do_something >> logfilestawia je tylko w pliku dziennika.

Celem teejest stworzenie scenariusza z jednym wejściem i wieloma wyjściami - tak jak w skrzyżowaniu „T”.

EDYTOWAĆ

Pojawiły się komentarze na temat tego, w jaki sposób teeumożliwia bardziej bezsensowne użycie sudo. Jest to obok punktu: cat, ddlub może lepiej bufferzapewnić taką możliwość z lepszych wyników, jeśli nie potrzebują wiele wyjść. Używaj teedo tego, co zostało zaprojektowane, a nie do tego, co „potrafi”

Eugen Rieck
źródło
37
Kluczem jest wiele wyników. teemoże nawet przyjmować wiele argumentów i zapisywać do wielu plików jednocześnie.
Kamil Maciorowski,
20
Nazwałbym go tee rurowego , a nie przejście (jak na skrzyżowaniu dróg?) Stuff jest w jedną stronę i wychodzi w obie strony.
user20574
7
Jak miałbym użyć catw prosty sposób zamiast teenp. echo /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern? echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_patternnie działa, ponieważ przekierowanie jest przetwarzane przez powłokę inną niż sudo. Jeśli chodzi o dd, echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_patterndziała, ale ddczęsto jest przytłoczonym narzędziem, które może wyrządzić ogromne szkody, szczególnie pod sudo. Co do tego buffer, nie jest domyślnie instalowany w żadnej dystrybucji opartej na RedHat lub Ubuntu, którą muszę podać (lub MacOS) ...
Digital Trauma
3
@EugenRieck Rozumiem twój pogląd na temat relacji 1: n pomiędzy in: out, która jest podstawową funkcją. Jednak ani wbudowane, catani nie /bin/catdziałają dla mnie w tej sytuacji. Nie ma znaczenia, skąd catpochodzi - >nadal będzie obsługiwany przez powłokę najwyższego poziomu (inną niż sudo). Zaletą teeprzejęcia catw tej sytuacji jest to, że pozwala ono plik wyjściowy zostać przekazany jako param wiersza polecenia (a nie przekierowanie). ddjest z pewnością realną opcją, choć nadal wolę teeto
Digital Trauma
3
@EugenRieck Co powłoka ma cati teejak wbudowane? A w jakiej wersji sudomożna uruchamiać wbudowane powłoki?
wjandrea,
118

Tee nie jest bezużyteczne

Może i tak to wiedziałeś? Jeśli nie, czytaj dalej! Lub jeśli wiesz, jak to działa, ale nie wiesz, dlaczego istnieje, przejdź do końca, aby zobaczyć, jak pasuje do filozofii uniksowej.

Jaki jest cel tee?

W najprostszym przypadku pobiera dane ze standardowego wejścia i zapisuje je na standardowym wyjściu i jednym (lub więcej) plikach. Przyrównano go do trójnika hydraulicznego w sposób, w jaki dzieli jeden wkład na dwa wyjścia (i dwa kierunki).

Przykłady

Weźmy twój pierwszy przykład:

do_something | tee -a logfile

To pobiera dane wyjściowe do_somethingi dołącza je do pliku dziennika, jednocześnie wyświetlając go użytkownikowi. W rzeczywistości strona Wikipediitee ma to jako drugi przykład:

Aby wyświetlić i dołączyć dane wyjściowe polecenia do istniejącego pliku:

  lint program.c | tee -a program.lint

Wyświetla standardowe wyjście polecenia lint program.c na komputerze i jednocześnie dołącza jego kopię na końcu pliku program.lint. Jeśli plik program.lint nie istnieje, zostanie utworzony.

Następny przykład ma jeszcze inne zastosowanie: eskalacja uprawnień :

Aby umożliwić eskalację uprawnień:

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

Ten przykład pokazuje, że trójnik jest używany do ominięcia nieodłącznego ograniczenia w sudopoleceniu. sudonie jest w stanie potokować standardowego wyjścia do pliku. Wrzucając do niego standardowy strumień /dev/nullwyjściowy, tłumimy również odbicie lustrzane w konsoli. Powyższe polecenie daje bieżącemu użytkownikowi root dostęp do serwera przez ssh, instalując klucz publiczny użytkownika na liście autoryzacji kluczy serwera.

A może chcesz pobrać dane wyjściowe jednego polecenia, napisać je gdzieś, a także użyć jako danych wejściowych do innego polecenia?

Możesz także użyć polecenia tee, aby zapisać dane wyjściowe polecenia w pliku i przekierować to samo wyjście jako dane wejściowe do innego polecenia.

Następujące polecenie wykona kopię zapasową wpisów crontab i przekaże wpisy crontab jako dane wejściowe do polecenia sed, które wykona zamianę. Po zamianie zostanie dodany jako nowe zadanie cron.

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

(uznanie za przykłady użycia poleceń Tee )

Tee współpracuje z filozofią Unix:

Pisz programy, które robią jedną rzecz i robią to dobrze. Pisz programy do współpracy. Pisz programy do obsługi strumieni tekstowych, ponieważ jest to uniwersalny interfejs.

(Podziękowania dla Basics of the Unix Philosophy )

tee pasuje do wszystkich:

  • robi jedną rzecz: tworzy dodatkową kopię danych wejściowych
  • działa z innymi programami, ponieważ jest to klej (lub element hydrauliczny „T”, jeśli wolisz), który pozwala innym programom współpracować, jak w powyższych przykładach
  • robi to poprzez manipulowanie strumieniem tekstu podanym na standardowym wejściu
bertieb
źródło
3
@Joe: sudo tee -ajest prawdopodobnie nowszą innowacją (po raz pierwszy zobaczyłem to w przewodnikach / wiki Ubuntu, szczególnie do ustawiania rzeczy /proc/sys, ponieważ przejście na Ubuntu miało miejsce, kiedy przełączyłem się na sudosystem oparty (domyślnie konfigurowany jest Ubuntu) zamiast używać suz hasło roota). Myślę, że teewcześniej sudo, więc nie jest to powód do teeistnienia. Nie potrzebujesz teetego, wystarczy pisać interaktywnie niż sudo sh -c 'cat > output'.
Peter Cordes,
1
Dzięki nowoczesnym powłokom, takim jak bash, możesz teekarmić dwa rurociągi foo | tee >(pipe2) | pipe1. Inną zabawą jest ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.loginteraktywne wyświetlanie aktualizacji linii statusu na terminalu tty, przy jednoczesnym usuwaniu „linii” kończących się znakiem powrotu karetki zamiast znaku nowej linii w celu faktycznego rejestrowania. (tj. odfiltruj aktualizacje linii statusu). Zasadniczo można umieścić tee /dev/ttydowolne miejsce w potoku jako wydruk debugowania.
Peter Cordes,
2
To mniej ograniczenie sudo, nad którym pracujesz, a bardziej ograniczenie interpretacji powłoki przez>. Kiedy uruchomisz polecenie z sudo, jego standardowe wyjście jest wysyłane z powrotem do programu powłoki, a dalsze przekierowania za pomocą> są uruchamiane z uprawnieniami powłoki. Jeśli chcesz pisać z podwyższonymi uprawnieniami, musisz mieć podwyższoną część potoku, co będzie pisaniem. Istnieje wiele sposobów, aby to zrobić, w zależności od tego, jaki efekt chcesz osiągnąć. Jeśli naprawdę chcesz użyć> czegoś takiego jak „sudo bash -c” command> outfile ”, to zrobi to.
Perkins
Dokładnie, @Perkins. Powłoka analizuje >i konfiguruje przekierowanie, zanim sudo w ogóle się dostanie exec, więc zdecydowanie nie jest ograniczeniem sudo, że nie obsługuje rzeczy, których nigdy nie widzi. :) Zwykle staram się nazywać to „tokiem pracy w sudo” lub innym podobnym terminem, kiedy go wyjaśniam, zamiast opisywać samego sudo.
dannysauer,
sudo tee -ajest IMHO nadużywaniem tee. Stosowanie sudo cat, sudo ddlub (z najlepszą wydajność w wielu przypadkach) sudo buffer, jeśli nie potrzebują wiele wyjść.
Eugen Rieck
70

Jest praktycznie taki sam i wymaga mniejszej liczby naciśnięć klawiszy na klawiaturze.

To wcale nie jest to samo ...

Poniższe wydają się być nieco równoważne, ale nie są to:

$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi

Zasadnicza różnica polega na tym, że ten pierwszy zapisał dane tylko do nazwanego pliku, a drugi zapisał hido terminalu ( stdout) i nazwanego pliku, jak pokazano poniżej:

przekierowanie vs tee


teepozwala zapisywać dane do pliku i używać ich w dalszym ciągu potoku, pozwalając na robienie użytecznych rzeczy - takich jak przechowywanie danych przed przejściem przez potok:

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

Lub możesz napisać do pliku z podwyższonymi uprawnieniami, nie nadając całego potoku podwyższonych uprawnień (tutaj echojest uruchamiany jako użytkownik, podczas gdy teezapisuje do pliku jako root):

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

Za pomocą teemożesz pisać do wielu plików ( i stdout ):

echo "hi" \
  | tee a.txt b.txt

Możliwe jest również użycie execz, teeaby nagrać wszystkie dane wyjściowe skryptu do pliku, jednocześnie pozwalając obserwatorowi ( stdout) zobaczyć dane:

exec > >( tee output.log )
Attie
źródło
2
Nie zapomnij exec > >(tee "$LOGFILE") 2>&1w skrypcie bash, który pozwala skryptowi wyprowadzać stdout i stderr zarówno do stdout, jak i do wskazanego pliku $LOGFILE.
rexkogitans
@rexkogitans 2> i 1 czy to nie jest składnia wsadowa cmd?
dmb
@dmb: To powłoki składni "wyślij sys.stderr (= 2), w tym samym miejscu, co standardowe wyjście (= 1)"
psmears
@ rexkogitans To było uczciwe pytanie, naprawdę nie mogę wiedzieć, że nie używałeś „Windoze” przez dekadę. Używam, 2>&1aby upuszczać dane wyjściowe i błędnie, aby txt plików w systemie Windows.
dmb
1
@dmb Przepraszam, że brzmiałem niegrzecznie. Chodzi o komentarz psmears. Oczywiście Windows przyjął tutaj styl uniksowy.
rexkogitans
27

To jest koszulka:
wprowadź opis zdjęcia tutaj

Łącznik rurowy w kształcie litery T. Ma wlot i dwa osobne gniazda.
Innymi słowy, dzieli jedną rurę na dwie; jak widelec na drodze.

Podobnie teejest potok ( |), który pozwala przekierować standardowe wejście na dwa osobne wyjścia.


Przykład
Powiedz na przykład, że piszesz ls /.
Otrzymasz wyjście, które wygląda mniej więcej tak:

Applications    Network     Users       bin        dev      net      private    tmp         var
Library         System      Volumes     cores      etc      home     opt        sbin        usr

Przekieruj wyjście do pliku tekstowego ls / > ls.txt, a żadne wyjście nie jest wyświetlane w powłoce, tylko w wynikowym pliku tekstowym.

Chcesz zobaczyć wynik i jednocześnie przekazać go do pliku tekstowego?
Dodaj a teedo swojej potoku ( |) tj .:ls / | tee ls.txt


Porównaj dwa:

ls /          >          ls.txt
ls /        | tee        ls.txt
głosy
źródło
4
+1 za zdjęcie, które jak wiemy jest warte tysiąca słów
Sergiy Kolodyazhnyy
Jeśli wybrałeś ogrodową rurkę T do węża ogrodowego, byłbyś zgodny z oryginalną metaforą Douga McIlroya.
JdeBP
@JdeBP Przepraszam, nie mam pojęcia, kto to jest. Czy jest oryginalnym autorem narzędzia czy coś takiego? Przepływ danych i fizyczny prąd elektryczny są często porównywane do układów hydraulicznych, ale zapewne o tym wiesz. W każdym razie po prostu wybrałem ten styl, aby był bardzo prosty. Właściwie zamierzałem to zrobić, aby było dobrze znane, ale odmiana ogrodowa ma zwykle więcej kształtów Y i / lub skomplikowanych wizualnie dodatków do mocowania akcesoriów itp. Jest to jednak zasadniczo takie samo.
głosów
18

Nie. Wspominasz jeden z niewielu przykładów, w których można przekierować do pliku za pomocą operatorów >i >>.

Ale Tee może zrobić znacznie więcej. Ponieważ potokujesz do niego, możesz następnie potokować do czegoś innego.

Dobry przykład znajduje się na stronie Wikipedii :

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

Zasadniczo możesz potokować do Tee, więc możesz następnie potokować z Tee do czegoś innego. Jeśli wszystko, co chcesz zrobić, to napisać plik dziennika, tak, to tak naprawdę nie potrzebujesz Tee.

LPChip
źródło
17

teejest daleki od bezużytecznego. Używam go cały czas i cieszę się, że istnieje. Jest to bardzo przydatne narzędzie, jeśli masz potok, który chcesz podzielić. Bardzo prostym przykładem jest to, że masz katalog $d, który chcesz tarować, a także chcesz go zaszyfrować, ponieważ jesteś paranoikiem (tak jak ja) i nie ufasz nośnikowi pamięci, aby niezawodnie przechowywać dane. Ty mógł zapisać go na dysku, a następnie mieszania go, ale to, że nie, jeśli archiwum zostanie uszkodzona przed jego mieszany. Co więcej, musisz go przeczytać, a jeśli pracujesz na plikach o wielkości kilkuset GB, będziesz wiedział, że naprawdę nie chcesz ich ponownie czytać, jeśli nie musi.

Więc po prostu to robię:

tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null

Tworzy smołę i przesyła ją do trójnika, a następnie przesyła ją do dwóch podpowłok, w jednej z nich jest mieszana, a w drugiej zapisywana na dysk.

Jest to również świetne, jeśli chcesz wykonać kilka operacji na dużym pliku:

< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null

Raz czyta plik, haszy go (dzięki czemu można sprawdzić, czy nadal jest taki, jak powinien), rozpakowuje go i kopiuje w inne miejsce. Nie trzeba w tym celu trzy razy go czytać.

UTF-8
źródło
3
Nitpick: teenie tworzy podpowłoki; wywoływana powłoka działa sha5sumi catłączy swoje dane wyjściowe z deskryptorami plików, które są przekazywane tee. Również bezużyteczne użycie cat; możesz użyć przekierowania wejściowego, aby teeodczytać bezpośrednio z file.tar.gz.
chepner
@chepner Masz rację co do pierwszego wtrącenia, ale całkowicie się mylisz co do drugiego. Lubię pisać moje potoki w kolejności, więc oznaczanie danych wejściowych po prawej stronie jest straszne dla czytelności, a to czyni wyraźnie obiektywnie gorsze od mojej metody i całkowicie nie subiektywnie preferuje moje. catjest miłość. catjest życie.
UTF-8
6
Możesz także napisać, < file.tar.gz tee >(sha256sum) ...jeśli martwisz się porządkiem leksykalnym przekierowań. Nie zmienia to faktu, że nie ma potrzeby wykonywania całkowicie osobnego procesu tylko do zasilania jednego pliku tee.
chepner
1
@chepner Cool, dziękuję! Nauczyłem się czegoś dzisiaj. :)
UTF-8
1
Koszt uruchomienia cat jest stosunkowo niski. Koszt dodatkowych 100 GiB wywołań systemowych zapisu i odczytu zdecydowanie marnuje dodatkowy czas procesora i przepustowość pamięci dla proponowanego przykładu ogromnego pliku. Pamiętaj, że przepustowość pamięci jest zasobem wspólnym dla wszystkich rdzeni, nie wspominając o dodatkowym zanieczyszczeniu pamięci podręcznej L3 z tego kopiowania. Na x86 z włączonym ograniczeniem Spectre + Meltdown wywołania systemowe są droższe niż kiedyś. Zużywasz mierzalną ilość dodatkowego czasu procesora w trakcie tej kopii. Nie >(cat > foo)jest też łatwiejsze do zrozumienia niż fooIMO.
Peter Cordes,
12

Nitpick w odpowiedzi na @ bertieb mówi: Ten przykład pokazuje, że tee jest używany do ominięcia nieodłącznego ograniczenia w poleceniu sudo. sudo nie może potokować standardowego wyjścia do pliku.

Nie ma żadnego nieodłącznego ograniczenia, tylko nieporozumienie dotyczące sposobu przetwarzania polecenia.

Przykład:

sudo echo 0 > /proc/sys/net/ipv4/ip_forward

Prąd powłoki analizuje wiersz polecenia. Znajduje przekierowanie wyjściowe i wykonuje to. Następnie wykonuje polecenie, które jest sudoi udostępnia pozostały wiersz polecenia jako argumenty dla wykonanego polecenia. Jeśli bieżąca powłoka nie ma uprawnień roota, przekierowanie danych wyjściowych zakończy się niepowodzeniem.

echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward

Działa to, ponieważ przekierowanie wyjścia jest odroczone do teepolecenia, które w tym momencie ma uprawnienia roota, ponieważ zostało wykonane za pośrednictwem sudo.

sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

Działa to, ponieważ powłoka wykonująca przekierowanie ma uprawnienia root.

studog
źródło
2
Może być również potrzebne sudopolecenie, ale nie do pliku wyjściowego, a przekierowanie działa dobrze:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Dennis Williamson,
10

Jak wspomnieli inni, przesyłanie danych wyjściowych do teepolecenia zapisuje je zarówno w pliku, jak i na standardowym wyjściu.

Często używam, teegdy chcę przechwycić dane wyjściowe polecenia, którego uruchomienie zajmuje dużo czasu, a także chcę wizualnie sprawdzić dane wyjściowe, ponieważ polecenie to udostępnia. W ten sposób nie muszę czekać na zakończenie działania polecenia przed sprawdzeniem danych wyjściowych.

Wydaje się, że jeszcze nie zostało wspomniane (chyba że go przegapiłem), że teepolecenie może również zapisywać do wielu plików jednocześnie. Na przykład:

ls *.png | tee a.txt b.txt

wypisze wszystkie *.pngpliki w bieżącym katalogu do dwóch różnych plików ( a.txti b.txt) jednocześnie.

W rzeczywistości możesz wpisać tekst do kilku różnych plików jednocześnie tee:

$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D
J L
źródło
9

Najpopularniejszym zastosowaniem tee jest wyświetlanie tekstu na terminalu w tym samym czasie, gdy wysyłasz go do pliku (lub plików). Sformułowanie twojego pytania zakłada, że ​​piszesz tylko tekst w plikach dziennika. Mam skrypty, które zapisują listy nazw plików lub nazw katalogów w celu wyzwolenia plików (do przetworzenia przez inne skrypty asynchronicznie) i używam tee do wysyłania tej samej treści na standardowe wyjście. Wszystkie standardowe wyjścia są kierowane do dzienników. Mam więc tekst tam, gdzie chcę, i mam zapis z dziennika, że ​​to zrobiłem, wszystko z jednej instrukcji „echo”

tee jest także najlepszą metodą w Uniksie do tworzenia wielu identycznych plików. Używam go od czasu do czasu do tworzenia wielu pustych plików, takich jak ten ...

:|tee file01 file02 file03
Wil Young
źródło
5
dlaczego nie touch? (bardziej oczywiste, co się dzieje)
Attie
@Attie touchnie będzie obcinać plików, jeśli już istnieją, ale tylko aktualizuje swoje znaczniki czasu i pozostawia ich zawartość taką, jaka jest; ale teeje obetnie. Poza tym robienie rm+ touchróżni się od tee(pomyśl o twardych linkach i dowiązaniach symbolicznych)
Matija Nalis,
Dlaczego więc nie truncate -s 0? :-)
Attie
1

Wyobraź sobie, że chcesz zapisać dane wyjściowe polecenia w pliku dziennika ORAZ wydrukować na standardowe wyjście. Kiedy musisz to zrobić w tym samym czasie, musisz tee.

Przykładem zastosowania są skrypty kompilacji, które zapisują całą kompilację na standardowe wyjście (np. Dla Jenkinsa), ale ważne rzeczy w tym samym czasie w osobnym pliku dziennika (dla e-maili podsumowujących).

Naprawdę zaczniesz zaginąć, teegdy będziesz musiał pisać skrypty w systemie Windows. Nie ma teei to jest naprawdę denerwujące.

domih
źródło
Czy tworzenie nie jest banalne?
Wyścigi lekkości na orbicie
Nie jest to możliwe w przypadku wsadowej / cmd, ponieważ nie można łatwo podzielić strumienia danych wyjściowych z polecenia.
domih
Racja, ale jak trzywierszowy program C ++ ...
Lekkość ściga się na orbicie
1
W dystrybucji unxutils systemu Windows znajduje się wiele narzędzi wiersza poleceń systemu Unix, które w przeciwieństwie do niektórych dystrybucji nie zanieczyszczają środowiska wykonawczego systemu Windows. Największym ograniczeniem jest „glob” bing, który działa inaczej w systemach Unix / Linux niż w systemie Windows. „tee” jest jednym z dostępnych narzędzi.
cmm
2
Nie bądź głupi, to 2018. Użyj PowerShell, ma tee. Cmd nigdy nie był przeznaczony do poważnego pisania skryptów - po to był VBS. Powershell to nowe narzędzie do tworzenia skryptów. To prawda, że ​​Cmd jest wciąż dość potężny, ale narzędzi wiersza poleceń jest niewiele.
Luaan,