Какова цель «тройник»?

19183
R Moog

Все случаи, которые teeя когда-либо видел, были такими:

 do_something | tee -a logfile 

Или же:

do_something_else | tee logfile 

Является ли teeпридумано для тех, которые не знают, что вы можете сделать то же самое с оболочкой трубой перенаправлениями? Такие как:

do_something >> logfile 

Или же:

do_something_else > logfile 

Это практически то же самое, и для набора текста требуется меньше нажатий клавиш. В каких скрытых функциях я не вижу tee?

87
Как на это не ответила самая первая строка справочной страницы * "... и записать в стандартный вывод и файлы" *? Ответы интересны, но широкий разговор о том, насколько полезны каналы, только подтверждает, что этот Q кажется * слишком широким * и, возможно, его следовало закрыть. Xen2050 5 лет назад 61
@ Xen2050 Вопрос не может быть обвинен в слишком широком ответе. Вопрос очень специфический, так же как и текущий [самый высокий рейтинг ответа] (https://superuser.com/a/1356843/179350). Jon Bentley 5 лет назад 3
@JonBentley вопрос не звучит как * «конкретная проблема с достаточным количеством деталей, чтобы найти адекватный ответ» * (как гласит диалог закрытия). Это звучит так: * «если на ваш вопрос может ответить целая книга или если на него есть много достоверных ответов (но нет способа определить, какие из них - если таковые имеются - правильные), то, вероятно, он слишком широк для нашего формата». * (Источник: [Справочный центр] (https://superuser.com/help/closed-questions)) Xen2050 5 лет назад 1
@ Xen2050 Мы читаем один и тот же вопрос? Это кажется мне очень специфичным - в чем разница между тройником и трубкой? Ответ был адекватным, используя два предложения. Далеко не вся книга. Тот факт, что некоторые ответы * выбирают *, чтобы идти по касательной, не имеет никакого отношения к объему вопроса. Jon Bentley 5 лет назад 4
@JonBentley: мы читаем один и тот же вопрос? R Moog вроде своего рода * подразумевает * довольно хорошо сфокусированный вопрос - в чем разница между `tee` * и ** перенаправлением ввода / вывода **? * Тот факт, что он говорит« shell *** pipe ** » перенаправления *, такие как `>` и `>>` ”, не являются точкой в ​​его пользу и являются аргументом для закрытия как неясного. Но на самом деле он задает несколько вопросов: «Какова цель« тройника »?», «Изобретен ли« тройник »для тех, кто не знает, что вы можете сделать то же самое с перенаправлением оболочки?» И «Какие скрытые функции я не видя в `` тройник``? ». По крайней мере, два из этих вопросов слишком широки. G-Man 5 лет назад 0
@ G-Man Вы должны изо всех сил, чтобы сделать эту интерпретацию. Очевидно, что фундаментальный Jon Bentley 5 лет назад 0
Я «должен сделать все возможное, чтобы сделать эту интерпретацию»? А? Я *** цитирую! *** G-Man 5 лет назад 0

10 ответов на вопрос

241
Eugen Rieck

То, что вы не видите, что do_something | tee -a logfileставит вывод в logfile и на стандартный вывод, а do_something >> logfileставит его только в лог - файл.

Цель teeсостоит в том, чтобы создать сценарий с одним входом и несколькими выходами, как в пересечении «Т».

РЕДАКТИРОВАТЬ

Там были комментарии о том, как teeпозволяет более простое использование sudo. Это рядом с точкой: cat, ddили, может быть, лучше bufferпредоставить эту возможность с более высокой производительностью, если вы не нужны несколько выходов. Используйте teeдля того, для чего он предназначен, а не для того, что он «может сделать»

Многократный вывод является ключом. `tee` может даже принимать несколько аргументов и записывать сразу в несколько файлов. Kamil Maciorowski 5 лет назад 37
Я бы назвал это тройником * фитингом *, а не перекрестком (как на пересечении дорог?). Материал приходит в одну сторону и выходит в обе стороны. user20574 5 лет назад 20
Даже после того, как вы сказали «пересечение Т», мне сразу не пришло в голову, что команда буквально записывает это Sirap 5 лет назад 0
О, это должно было быть похоже на Т-образный переход? Раньше я предполагал, что это была ссылка на футболку для гольфа. Anon 5 лет назад 0
Кроме того, вы не можете использовать `sudo` при перенаправлении на файл, для которого у вас нет прав, в то время как вы всегда можете использовать` sudo` для `tee`. Fanatique 5 лет назад 1
How would I use `cat` in a straightforward way instead of `tee` in e.g. `echo /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern`? `echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern` doesn't work, because the redirect is processed by the non-sudo shell. As for `dd`, `echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern` works, but `dd` is often an overpowered tool capable of doing great damage, especially under `sudo`. As for `buffer`, its not installed by default in any of the RedHat- or Ubuntu-based distros I have to hand (or MacOS)... Digital Trauma 5 лет назад 7
... `echo /var/work/core.%p | sudo sh -c 'cat > /proc/sys/kernel/core_pattern'`works, though I think that extra `sh -c` is hardly elegant Digital Trauma 5 лет назад 0
@DigitalTrauma `echo /var/work/core.%p | sudo /bin/cat > /proc/sys/kernel/core_pattern` works fine - your command line uses the shell-internal version of cat (but not the shell-internal version of tee). In addition to that, `sudo tee` and `sudo dd` have exactly the same potential to destruct. Un a new Ubuntu, `audo apt install buffer` is one of the "must do" customizations, as `sudo buffer` can work wonders, if you e.g. write an ffmpeg log to a disk. Most importantly, my point was, that the `sudo`use of `tee` is not what makes it special - the 1:n relation between in and out is. Eugen Rieck 5 лет назад 0
@EugenRieck I do get your point about about the 1:n relation between in:out being the primary function. However, neither the builtin `cat` nor `/bin/cat` work for me in this situation. It doesn't matter where `cat` comes from - the `>` will still be handled by the top level (non-sudo) shell. The advantage of `tee` over `cat` in this situation is that it allows the output file to be passed as a command-line param (and not a redirect). `dd` is certainly a viable option, though I'd still favour `tee` for this Digital Trauma 5 лет назад 3
@EugenRieck В какой оболочке есть `cat` и` tee` как встроенные? А какая версия `sudo` может запускать встроенные оболочки? wjandrea 5 лет назад 3
@wjandrea BASH в Ubuntu 18.04 имеет `cat`, но не` tee`, согласно man 7 `bash-builtins` Eugen Rieck 5 лет назад 0
@Eugen Где в [man-странице] (http://manpages.ubuntu.com/manpages/bionic/man7/bash-builtins.7.html) это сказано? wjandrea 5 лет назад 0
@EugenRieck с использованием `sudo cat> ...` _не работает_, и _не может работать_, если ваша оболочка (объект, разбирающий командную строку) не имеет разрешения на запись в файл. `> ...` анализируется оболочкой, она не передается приложению в качестве аргумента. Это не имеет никакого отношения к тому, чтобы быть встроенным. Attie 5 лет назад 3
119
bertieb

Tee не бесполезен

Может быть, вы знали это в любом случае? Если нет, то читайте дальше! Или, если вы знаете, как он работает, но не знаете, почему он существует, перейдите к концу, чтобы увидеть, как он вписывается в философию Unix.

Что это цель tee?

В простейшем случае он берет данные на стандартный ввод и записывает их в стандартный вывод и один (или более) файл. Он был уподоблен соединительному тройнику так, как он разделяет один вход на два выхода (и два направления).

Примеры

Давайте возьмем ваш первый пример:

do_something | tee -a logfile 

Он принимает вывод do_somethingи добавляет его в файл журнала, а также отображает его для пользователя. На самом деле, страница Википедииtee содержит второй пример:

Чтобы просмотреть и добавить вывод команды из существующего файла:

 lint program.c | tee -a program.lint 

Это отобразит стандартный вывод команды lint program.c на компьютере и одновременно добавит его копию в конец файла program.lint. Если файл program.lint не существует, он создается.

В следующем примере есть другое применение: повышение разрешений :

Чтобы разрешить эскалацию разрешений:

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

В этом примере показано, как тройник используется для обхода внутреннего ограничения в sudoкоманде. sudoне может передать стандартный вывод в файл. Выгружая его стандартный поток вывода /dev/null, мы также подавляем зеркальный вывод в консоли. Приведенная выше команда предоставляет текущему пользователю root доступ к серверу через ssh, установив открытый ключ пользователя в список авторизации ключей сервера.

Или, может быть, вы хотите взять выходные данные одной команды, записать их где-нибудь, а также использовать их в качестве входных данных для другой команды?

Вы также можете использовать команду tee для сохранения вывода команды в файл и перенаправления того же вывода, что и ввод другой команды.

Следующая команда создаст резервную копию записей crontab и передаст записи crontab как входные данные для команды sed, которая выполнит замену. После замены он будет добавлен в качестве нового задания cron.

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

(благодарность за примеры использования команды Tee )

Tee работает с философией Unix:

Напишите программы, которые делают одно и делают это хорошо. Напишите программы для совместной работы. Написание программ для обработки текстовых потоков, потому что это универсальный интерфейс.

(Благодарность основам философии Unix )

tee подходит всем этим:

  • он делает одну вещь: создает дополнительную копию ввода
  • он работает с другими программами, потому что это клей (или кусок сантехники 'T', если вы предпочитаете), который позволяет другим программам работать вместе, как в примерах выше
  • это происходит путем манипулирования текстовым потоком, заданным на стандартном вводе
@Joe: `sudo tee -a` is probably a more recent innovation (I first saw it in Ubuntu guides / wikis especially for setting stuff in `/proc/sys`, because switching to Ubuntu was when I switched to a `sudo` based system (how Ubuntu is configured by default) instead of using `su` with a root password). I think `tee` predates `sudo`, so it's not a reason for `tee` existing. You don't need `tee` for that, it's simply shorter to type interactively than `sudo sh -c 'cat > output'`. Peter Cordes 5 лет назад 3
With modern shells like bash, you can `tee` to feed two pipelines, like `foo | tee >(pipe2) | pipe1`. Or another fun one is `ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log` to see status-line updates interactively on the tty, while removing "lines" that end with carriage-return instead of newline for actual logging. (i.e. filter out the status-line updates). In general, you can stick a `tee /dev/tty` anywhere in a pipeline as a debug-print. Peter Cordes 5 лет назад 1
It's less a limitation of sudo you're working around and more a limitation of the shell's interpretation of >. When you run a command with sudo its stdout gets sent back to your shell program and further redirects with > are run with the shell's permissions. If you want to write with elevated permissions you need to have the elevated part of the pipeline be what does the writing. There are a large number of ways to do this depending on precisely what effect you're going for. If you really want to use > something like 'sudo bash -c "command > outfile" ' will do the job. Perkins 5 лет назад 2
Exactly, @Perkins. The shell parses the `>` and sets up the redirection before sudo even get `exec`'d, so it's _definitely_ not a limitation of sudo that it doesn't handle things it never sees. :) I usually try to refer to this as "the sudo workflow" or some similar term when I'm explaining it, rather than describing sudo itself. dannysauer 5 лет назад 0
`sudo tee -a` - ИМХО злоупотребление мишенью. Используйте `sudo cat`,` sudo dd` или (с лучшей производительностью во многих случаях) `sudo buffer`, если вам не нужны множественные выходы. Eugen Rieck 5 лет назад 0
69
Attie

Это практически то же самое, и для набора текста требуется меньше нажатий клавиш.

Это совсем не то же самое ...

Следующее представляется несколько эквивалентным, но это не так:

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

Критическое различие заключается в том, что первый записал данные только в именованный файл, а второй записал hiв терминал ( stdout) и названный файл, как показано ниже:

перенаправление против тройника


teeпозволяет вам записывать данные в файл и использовать их в последующем конвейере, что позволяет вам делать полезные вещи, такие как хранение данных из части через конвейер:

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

Или вы можете записать в файл с повышенными привилегиями, не предоставляя всему конвейеру повышенные привилегии (здесь echoзапускается как пользователь, а teeзаписывает в файл как root):

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

С помощью teeвы можете записать много файлов ( и stdout ):

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

Также возможно использовать execс teeдля записи всех выходных данных скрипта в файл, все еще позволяя наблюдателю ( stdout) видеть данные:

exec > >( tee output.log ) 
Not to forget `exec > >(tee "$LOGFILE") 2>&1` in a bash script which lets the script output stdout and stderr to both, stdout and the file pointed to by `$LOGFILE`. rexkogitans 5 лет назад 2
@rexkogitans 2>&1 isn't that cmd batch syntax? dmb 5 лет назад 0
@dmb: это синтаксис оболочки для «отправки stderr (= 2) в то же место, что и stdout (= 1)» psmears 5 лет назад 0
@rexkogitans It was a fair question really, I can't really know that you haven't used "Windoze" for a decade. I use `2>&1` to drop output and err to txt files in windows. dmb 5 лет назад 0
@dmb Прошу прощения за грубость. Это все о комментарии psmears. Очевидно, что Windows приняла Unix-стиль здесь. rexkogitans 5 лет назад 1
Вы должны действительно отредактировать свои диаграммы так, чтобы команда была ниже, `tee` выше и два выхода с обеих сторон, как T ... Peter A. Schneider 5 лет назад 0
Technically the data is written to STDOUT (filehandle 1) in both cases. It's just that in the case of the redirect, `echo`'s STDOUT is connected to a file by the shell, while in the case of the pipeline, `tee`'s STDOUT is connected to the terminal. This is a good answer on a technical site, so reasonable me defers to pedantic me. ;) dannysauer 5 лет назад 0
26
tjt263

Это тройник:
enter image description here

Т-образный фитинг. Он имеет вход и два отдельных выхода.
Другими словами, он разделяет одну трубу на две; как развилка на дороге.

Аналогично, teeэто pipe ( |), который позволяет перенаправить ваш стандартный ввод на два отдельных выхода.


Пример
Скажем, например, вы печатаете ls /.
Вы получите вывод, который выглядит примерно так:

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

Перенаправьте вывод в текстовый файл, ls / > ls.txtи вывод не будет отображаться в оболочке, только в результирующем текстовом файле.

Хотите увидеть вывод и одновременно передать его в текстовый файл?
Добавьте teeк своей трубе ( |) то есть:ls / | tee ls.txt


Сравните два:

ls / > ls.txt ls / | tee ls.txt 
+1 за картинку, которая, как мы знаем, стоит тысячи слов Sergiy Kolodyazhnyy 5 лет назад 4
Если бы вы выбрали тройник садового шланга, вы бы согласились с оригинальной метафорой Дуга Макилроя. JdeBP 5 лет назад 0
@JdeBP Извините, я понятия не имею, кто это. Он оригинальный автор утилиты или что-то? Поток данных и физический электрический ток часто сравнивают с гидравлическими системами, но вы, вероятно, знаете это. В любом случае, я просто выбрал этот стиль, чтобы он был очень простым. На самом деле я собирался сделать это, чтобы держать его в курсе, но у садового сорта, как правило, больше Y-образных и / или визуально сложных приспособлений для крепления аксессуаров и т. Д. По сути, это то же самое. tjt263 5 лет назад 0
М. Дуглас Макилрой, автор [этой известной записки] (https://www.bell-labs.com/usr/dmr/www/mdmpipe.html), который [работал в Bell Labs] (https: // s3-us -west-2.amazonaws.com/belllabs-microsite-unixhistory/streams.html) и [убедили Кена Томпсона вставить трубы в Unix] (https://s3-us-west-2.amazonaws.com/belllabs-microsite -unixhistory / sohedid.html). JdeBP 5 лет назад 1
18
LPChip

Нет. Вы упомянули один из немногих примеров, где вы действительно можете перенаправить на файл с помощью операторов >and >>.

Но Ти может сделать гораздо больше. Поскольку вы передаете это по трубопроводу, вы можете передать это по другому.

Хороший пример приведен на странице википедии :

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

По сути, вы можете передавать по трубопроводу к Tee, поэтому вы можете затем передать по трубопроводу от Tee к чему-то другому. Если все, что вы хотите сделать, это написать файл журнала, да, тогда вам не нужен Tee.

17
UTF-8

teeдалеко не бесполезен. Я использую это все время и рад, что это существует. Это очень полезный инструмент, если у вас есть конвейер, который вы хотите разделить. Очень простой пример - у вас есть какой-то каталог, $dкоторый вы хотите скопировать, и вы также хотите его хэшировать, потому что вы параноик (как и я) и не доверяете носителю для надежного хранения данных. Вы можете сначала записать его на диск, а затем хэшировать, но это не получится, если архив будет поврежден до того, как будет хеширован. Кроме того, вам придется прочитать его, и если вы будете много работать с файлами размером в несколько сотен ГБ, вы поймете, что действительно не хотите читать их снова, если этого не требуется.

Так что я делаю просто так:

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

Он создает тарный шарик и направляет его в тройник, который затем направляет его в две вложенные оболочки, в одной из которых он хэшируется, а в другой - записывается на диск.

Также замечательно, если вы хотите выполнить несколько операций над большим файлом:

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

Считывает файл один раз, хэширует его (чтобы вы могли проверить, все ли оно в порядке), извлекает его и копирует в другое место. Нет необходимости читать это три раза для этого.

Nitpick: `tee` не создает подоболочки; вызывающая оболочка запускает `sha5sum` и` cat` и соединяет их вывод с файловыми дескрипторами, которые передаются в `tee`. Также бесполезное использование `cat`; Вы можете использовать перенаправление ввода, чтобы `tee` читался напрямую из` file.tar.gz`. chepner 5 лет назад 3
@chepner Вы правы насчет первого междометия, но совершенно не правы во втором. Мне нравится писать свои конвейеры по порядку, поэтому обозначение ввода справа ужасно для читабельности, и это явно объективно уступает моему методу и совершенно не является моим субъективным предпочтением. `кошка '- это любовь. `кошка '- это жизнь. UTF-8 5 лет назад 0
You can also write `< file.tar.gz tee >(sha256sum) ...` if you are concerned about the lexical ordering of the redirections. That doesn't change the fact that there is no need for an entirely separate process just to feed a single file to `tee`. chepner 5 лет назад 6
@chepner Круто, спасибо! Узнал что-то сегодня. :) UTF-8 5 лет назад 1
Useless use of `dd` as well. Use `/other/storage/location/file.tar.gz` as an arg to `tee`, so it writes to the file directly instead of to a pipe to another process. Same problem with the first example: you're gaining no readability at all by piping the output through `cat > "$d".tar`. Wait, you actually have the quotes on the `".tar"` but the expansion of `$d` is unquoted?!?) Peter Cordes 5 лет назад 0
@chepner, ты просто изменил мою жизнь навсегда: O Shadow 5 лет назад 0
@PeterCordes, the `cat`s may be gratuitous, but `dd` will report transfer statistics to STDERR upon receiving SIGUSR1 (useful if the job takes longer than expected). Or, replace either with `pv` to report transfer statistics to STDERR at the end. david 5 лет назад 0
@ Давид Да. Вы также можете передать `status = progress` do` dd`, чтобы получить информацию о прогрессе. Конечно, используя вы запускаете другой процесс, и команда становится немного длиннее. Но это не намного сложнее, и я думаю, что с `cat` это легче понять. Кроме того, сколько конкретно стоит другой процесс? Я не понимаю, почему это было бы критерием. UTF-8 5 лет назад 0
The cost of *starting* `cat` is relatively low. The cost of an extra 100 GiB of write + read system calls definitely wastes extra CPU time and memory bandwidth for your proposed example of a huge file. Remember that memory bandwidth is a shared resource across all cores, not to mention the extra pollution of L3 cache from that copying. On an x86 with Spectre + Meltdown mitigation enabled, system calls are more expensive than they used to be. You're using up a measurable amount of extra CPU time over the course of that copy. Also `>(cat > foo)` is not easier to understand than `foo`, IMO. Peter Cordes 5 лет назад 1
@david: you can see file-descriptor positions from outside a process on Linux, using `/proc/PID/fdinfo/3`. You can attach `pv` to an already-running process to monitor it, instead of piping data *through* `pv`, using `pv -d 1234:3` (PID:FD). http://man7.org/linux/man-pages/man1/pv.1.html. So you don't need to slow down your system with extra memory copying just in case it you end up wanting to monitor it. Peter Cordes 5 лет назад 0
That tar command should probably include `-f -`. If that argument isn't specified, tar will use an environment variable (`$TAPE`) if present, and will then use a compiled-in default which is not defined in the man page and not necessarily a standard. dannysauer 5 лет назад 0
@dannysauer Страница man `tar`, которую я имею, действительно указывает это. В разделе «environment» `TAPE` описывается как:« Устройство или файл, который будет использоваться для архива, если --file не указан. Если эта переменная окружения не установлена, используйте вместо этого stdin или stdout ». Я не уверен, действительно ли это нигде не указано. Я думаю, вы можете быть уверены, что эта переменная окружения не установлена. UTF-8 5 лет назад 0
Weird - my man page says "Otherwise, tar will assume the compiled-in default. The default value can be inspected either using the --show-defaults option, or at the end of the tar --help output." Either way, in my "25 years of Unix sysadmin hair-pulling-out" opinion, those four extra characters are a way better use of my time than eventually spending half a day tracking down why the script doesn't work due to an environment variable on that one machine ol' Larry screwed up five years ago by copying some half-baked shell excerpt from a forum into /etc/profile. :D dannysauer 5 лет назад 0
12
studog

Nitpick в ответе @ bertieb, в котором говорится, что в этом примере показано, как тройник используется для обхода врожденного ограничения в команде sudo. sudo не может передать стандартный вывод в файл.

Не существует внутренних ограничений, только неправильное понимание того, как обрабатывается команда.

Пример:

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

Текущая оболочка разбирает командную строку. Он находит перенаправление вывода и выполняет это. Затем он выполняет команду, которая является sudoи предоставляет оставшуюся командную строку в качестве аргументов для выполняемой команды. Если текущая оболочка не имеет прав доступа root, перенаправление вывода завершится ошибкой.

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

Это работает, потому что перенаправление вывода откладывается на teeкоманду, которая на тот момент имеет права root, потому что она была выполнена с помощью sudo.

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

Это работает, потому что у оболочки, выполняющей перенаправление, есть права доступа root.

Also, you might need `sudo` for the command, but not for the file being output and the redirection works just fine: `sudo foo-needs-privilege > /tmp/this-output-file-doesnt` Dennis Williamson 5 лет назад 2
10
J-L

Как уже упоминали другие, вывод teeкоманды в команду записывает эти выходные данные как в файл, так и в стандартный вывод.

Я часто использую, teeкогда хочу получить выходные данные команды, выполнение которой занимает много времени, а также хочу визуально проверить выходные данные, поскольку команда делает их доступными. Таким образом, мне не нужно ждать завершения команды, прежде чем я проверю вывод.

То, что, кажется, еще не было упомянуто (если я не пропустил это), это то, что teeкоманда также может записывать несколько файлов одновременно. Например:

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

запишет все *.pngфайлы в текущем каталоге в два разных файла ( a.txtи b.txt) одновременно.

Фактически, вы можете набирать текст сразу в нескольких разных файлах 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 
9
Wil Young

Наиболее распространенное использование tee - видеть текст на терминале одновременно с отправкой его в файл (или файлы). Формулировка вашего вопроса предполагает, что вы когда-либо пишете текст в лог-файлы. У меня есть сценарии, которые пишут списки имен файлов или каталогов для запуска файлов (которые должны обрабатываться другими сценариями асинхронно), и я использую tee для отправки того же содержимого на стандартный вывод. Весь stdout направлен на логи. Итак, у меня есть текст, где я хочу, и у меня есть запись в журнале, в которой я это сделал, все из одного утверждения 'echo'

Это также лучший метод в Unix для создания нескольких одинаковых файлов. Я иногда использую его для создания нескольких пустых файлов, как это ...

:|tee file01 file02 file03 
почему не "трогать"? (больше сразу видно, что происходит) Attie 5 лет назад 5
@ Att `touch` не будет обрезать файлы, если они уже существуют, а только обновит свои временные метки и оставит их содержимое как есть; но `тройник` будет их обрезать. Кроме того, выполнение `rm` +` touch` отличается от `tee` (подумайте о жестких и символических ссылках) Matija Nalis 5 лет назад 0
Тогда почему бы не `truncate -s 0`? :-) Attie 5 лет назад 0
1
domih

Представьте, что вы хотите записать вывод команды в файл журнала и распечатать на стандартный вывод. Когда вам нужно сделать это одновременно, тогда вам нужно tee.

Вариант использования - иметь сценарии сборки, которые записывают всю сборку в стандартный вывод (например, для Jenkins), но одновременно важные вещи в отдельный файл журнала (для сводных электронных писем).

Вы действительно начнете скучать, teeкогда вам придется сценарий в Windows. Нет teeи это действительно раздражает.

Разве это не тривиально создавать? Lightness Races in Orbit 5 лет назад 0
С batch / cmd это невозможно, так как вы не можете легко разделить поток вывода команды. domih 5 лет назад 0
Правильно, но как программа C ++ с тремя строками ... Lightness Races in Orbit 5 лет назад 0
The Windows unxutils distribution has many Unix command line tools which, unlike some distributions, do not pollute your Windows execution environment. The biggest limitation is on "glob"bing, which works differently on Unix/Linux than on Windows. "tee" is among the tools available. cmm 5 лет назад 1
@LightnessRacesinOrbit Я почти уверен, что большинство утилит командной строки Unix начинались как программы на три строки. В конце концов, это была одна из основных философий проектирования в Unix - крошечные инструменты, которые хорошо выполняют одну работу и хорошо общаются с другими. Luaan 5 лет назад 0
Не будь глупым, это 2018. Используйте Powershell, у него есть "тройник". Cmd никогда не предназначался для серьезных сценариев - для этого и был VBS. Powershell - это новый инструмент для написания скриптов. Конечно, Cmd все еще довольно мощный, но инструментов командной строки довольно мало. Luaan 5 лет назад 2
@Luaan Ну, точно! Следовательно, портирование этой философии в вашу среду разработки Windows при необходимости кажется легким делом Lightness Races in Orbit 5 лет назад 0

Похожие вопросы