Аналог команды tee в windows

Обновлено: 05.07.2024

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

Июль 2010
Пн Вт Ср Чт Пт Сб Вс
« Июнь Авг »
1234
567891011
12131415161718
19202122232425
262728293031

Команда tee - вывод stdin на экран и в файл

Calendar

5 июля 2010, 18:06

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


то мы вывод команды ping сохраним в файл ping.txt, но не будем видеть что команда выводит на экране монитора.

И вот на курсах Linux на одной лекции преподаватель показал как сделать такую вещь. В конспект я записал, но впоследствии забыл в какой теме, потом лень было искать, а сегодня наконец решил все таки найти эту запись. И нашел.

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

Записав такую конструкцию видим на экране вывод команды ping, и в это же время все что выводит ping записывается с помощью tee в файл pingigorka.txt.

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

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

Синтаксис команды tee

Синтаксис команды достаточно простой:

$ tee опции файл

  • -a или -append - Используется для записи вывода в конец существующего файла.
  • -i или -ignore-interrupts - Используется, чтобы игнорировать прерывающие сигналы.
  • -help - Используется для показа всех возможных операций.
  • -version - Используется для показа текущей версии этой команды.

Для сохранения вывода команды можно передать один или несколько файлов.

Примеры использования

1. Простое использование команды tee

Команда ls -la нужна в Linux для показа списка файлов с описанием в текущем каталоге. Здесь команда tee используется для сохранения вывода ls -la в файл вывод.txt Введите следующие команды в терминале, чтобы проверить как работает команда tee.

ls -la | tee вывод.txt

Здесь первая команда показала вывод списка файлов в текущем каталоге в терминал и записала полученные данные в файл вывод.txt


Вторая команда показала содержимое файла вывод.txt


2. Добавление вывода в существующий файл

Если вывод любой команды записать в существующий файл с применением команды tee и операции -a, содержимое файла не будет перезаписано. Здесь вывод команды pwd будет добавлен в конец файла вывод.txt Запустите следующие команды с помощью терминала:

pwd | tee -a вывод.txt

Здесь первая команда отображает вывод pwd в терминал и записывает вывод в конец файла вывод.txt Вторая команда используется для выделения вывода файла. Показано, что файл вывод.txt содержит оба результата: из предыдущего примера и из этого.


3. Запись вывода в несколько файлов

Команда tee может использоваться для вывода любой команды сразу в несколько файлов. Для этого необходимо указать имена файлов, разделив их пробелом. Используйте следующие команды для сохранения вывода date в два файла: вывод1.txt и вывод2.txt

date | tee вывод1.txt вывод2.txt

cat вывод1.txt вывод2.txt

Здесь первая команда выводит текущее системное время и сохраняет полученные результаты в два файла вывод1.txt и вывод2.txt Вторая команда показывает идентичное содержимое обоих файлов.


4. Игнорируем прерывание сигнала

Команда tee linux с опцией -i используется в этом примере, чтобы игнорировать любые прерывания во время ее выполнения. Таким образом, команда будет выполнена правильно, даже если пользователь нажимает CTRL+C. Выполните следующие команды в терминале.

wc -l вывод.txt | tee -i вывод3.txt

Здесь первая команда считает количество строчек в файле вывод.txt и сохраняет полученный результат в файл вывод3.txt Вторая команда показывает содержимое файла вывод.txt, который содержит 37 строчек. Третья команда показывает содержимое файла вывод3.txt, в котором указано, что он действительно содержит 37 строчек.


5. Перенос вывода команды tee в другую команду

Вывод команды tee может быть перенесен в другую команду. В этом примере вывод из первой команды переносится в tee, а ее вывод — в другую команду. Запустите следующие команды в терминале:

ls | tee вывод4.txt | wc -lcw

Здесь первая команда используется для записи вывода ls в файл вывод4.txt и подсчета общего числа строк, слов и символов в файле вывод4.txt Вторая команда используется для отображения вывода команды ls, а третья — для отображения содержимого файла вывод4.txt


6. Команда tee и скрипты

Команда tee также может использоваться для записи вывода bash-скрипта в файл. Создайте bash-файл с приведенным кодом, который возьмет два входных числа из аргументов командной строки и выведет сумму этих чисел. Команда tee используется в этом примере для записи вывода add.sh в файл результат.txt

Запустите следующую команду в терминале для записи файла и отображения его содержимого.

bash add.sh 40 80 | tee результат.txt

Здесь числа 40 и 80 переносятся в качестве аргументов командной строки в скрипт add.sh и вывод записывается в файл результат.txt Команда cat выводит соответствующий результат.


7. Как скрыть вывод команды в терминале

Если вы хотите записать вывод прямо в файл и не показывать его в терминале, используйте /dev/null с командой tee. Для этого выполните следующие команды.

df | tee вывод5.txt > /dev/null

Здесь первая команда используется для записи вывода команды df в файл вывод5.txt, при этом вывод не показывается в терминале. Вторая команда показывает полученный результат.

Итоги

Вывод любой команды может использоваться для нескольких целей. Используя команду tee с разными опциями, можно сохранить вывод команды в нескольких файлах. Применение команды tee в наиболее распространенных случаях хорошо показано в этой инструкции с примерами. Надеемся, читателю будут полезны приведенные упражнения.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

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

у меня есть настройка таким образом:

Я пробовал с отдельной .bat файл и попытался включить в качестве функции (preffered) в исходном .bat нет avail with:

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

как я могу заставить команду Tee работать должным образом с моим .bat, чтобы я мог разделить вывод как на файл, так и на консоль.

есть чистые пакетные трюки, которые могут приблизить вас, но я думаю, что есть еще одна проблема, которая не может быть решена с чистой партией. Ваш исполняемый файл может поместить приглашение в строку без выдачи новой строки. Я считаю, что pure native batch всегда читает целые строки (за исключением случаев, когда конец потока). Я не знаю пакетного метода для чтения символа за символом.

небольшая коррекция - SET /P смогите прочитать частично линии piped входного сигнала, но оно имеет ограничения которые предотвращают его от быть использованным для робастного разрешения тройника серии: никакой путь знать наверняка когда каждая линия кончается. Он ограничен 1021 символами на "строку". Он удаляет символы управления из конца каждой "строки". Невозможно сказать, когда это произошло. дошел до конца входного потока.

но есть простое решение-JScript или VBScript работает как чемпион и не требует каких-либо специальных установок. Вот гибридный сценарий JScript / batch, который должен работать для вас. JScript плохо написан с большим количеством возможностей для улучшения. Например, отсутствует проверка ошибок.

Я сохраняю скрипт как tee.bat . Первый обязательный аргумент указывает имя файла для записи. По умолчанию файл переписано, если оно уже существует. Если предоставляется второй аргумент (значение не имеет значения), то вывод добавляется к файлу.

использование в значительной степени, как и следовало ожидать.

последние 1 аргумент добавить сил. Это может быть любое значение, кроме 1

можно поместить все в один пакетный скрипт, как вам кажется предпочитать.

обновление

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

Разделы можно пропускать без ущерба для понимания, ровно как и любые непонятные/неинтересные места в них.

Да, в Windows есть аналог многоликой команды cat, которая является одной из команд, выражающих суть UNIX'а. Это команда type. Она принимает один или несколько аргументов — имена файлов.

Если нужно, чтоб type читал с экрана (например, если нужно создать файл, на лету наполнив его содержимым), то нужно набрать

con — это аналог /dev/tty (подробнее об этом в следующем разделе).
То есть вышеприведённая команда является аналогом UNIX'овой команды cat /dev/tty > file или cat - > file или просто cat > file .

Когда вы закончите набирать файл, нажмите на новой строке Ctrl-Z и Enter. Это признак конца файла, аналог Ctrl-D в UNIX'е.

Сейчас будет куча технических подробностей про Ctrl-D и Ctrl-Z, их можно пропустить и перейти к следующему разделу.

В UNIX'е, когда юзер нажимает Ctrl-D, эта комбинация не обрабатывается самим приложением (например, в GNU/Linux в tty1 она обрабатывается ядром, если включен CONFIG_VT [на сегодняшний день (2012) CONFIG_VT включен по дефолту на десктопе, хотя есть планы по её выкидыванию]). А запущенное приложение получает EOF (End Of File, конец файла) в чистом виде (а не саму комбинацию клавиш или символ Ctrl-D). То есть как если бы ввод просто закончился. Иными словами, getchar в приложении возвращает EOF, а read — 0.

В Windows то же самое, Ctrl-Z и Enter заставляют getchar вернуть EOF.

Аналог /dev/null — это устройство nul. Причём оно как бы присутствует в каждой папке. Это тянется со времён старых версий DOS'а, когда не было папок.

Теперь о других устройствах. Аналог /dev/tty — это con, от слова console. Причём con — это аналог именно /dev/tty , а не /dev/console , так как в Windows у каждого окна командной строки con свой.

Аналоги /dev/ttyS0 , /dev/ttyS1 , /dev/ttyS2 , /dev/ttyS3 — это com1, com2, com3, com4 (но винде есть ещё com5 и т. д.). Это устройства serial console, они же COM-порты, они же последовательные порты.

Обычными средствами винды нельзя создать файл или папку с именем con или nul и т. д. Но можно исхитриться: mkdir \\.\c:\con .

После прочтения предыдущего раздела у вас мог возникнуть вопрос: и что, всё? /dev/null , /dev/tty и ещё несколько штук девайсов? А где /dev/sda1 и прочие бесчисленные устройства? Ведь в GNU/Linux'е папка /dev может содержать сотни устройств!

Ответ таков: да, в Windows есть целая папка с такими устройствами. Это \Device . Её сложно посмотреть через обычный пользовательский интерфейс. Там лежат устройства типа \Device\HarddiskVolume1 — это аналог GNU/Linux'ового /dev/sda1 .

Эти устройства появились в NT-шных версиях Windows'а и не тянутся с DOS'овых времён, в отличие от устройств из предыдущего раздела.

cmd1 | cmd2 , так же, как и в UNIX.

Его аналог — это ветка HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices в реестре Windows (да, да, в винде, как и в UNIX, есть понятие монтирования). Кстати, если у вас до этого были проблемы с переносом установленного Windows'а с одного раздела на другой, или с переименованием дисков в Windows'е или с чем-то ещё подобным, то — вот оно, решение!

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

Если, скажем, вы перенесли Windows с одного раздела на другой, то после этого нужно сделать два шага: разобраться с загрузчиком и его конфигами (об этом в следующем разделе) и подредактировать этот самый ключ реестра (в общем-то так же, как и в GNU/Linux'е: GRUB + fstab). Если ключ не подредактировать, то винда загрузиться не сможет, так начнёт грузиться с нового раздела (то есть того, на который мы копирнули винду), а продолжит — со старого (то есть того, с которого мы копирнули винду). Все системные вещи будут загружены с нового, а всякие Касперские — со старого. Итак, нужно удалить из этой ветки все записи, кроме записи "(По умолчанию)". Тогда винда забудет всё, что знала о разделах и при следующем запуске будет считать своим разделом тот, с которого запустилась (что нам и надо). Короче говоря, автоматически определит разделы.

  • Почистить реестр, выключить компьютер (можно «жёстко»), а потом копирнуть винду. Однако, я это не проверял. Не факт, что винда даст вам отредактировать этот ключ реестра и что она не заполнит его снова при выключении
  • Отредактировать реестр, и сразу же, не выключая комп, копирнуть запущенную винду на другой раздел. Но и это тоже не проверялось
  • Если вы копируете винду с одного физического диска на другой, можно после копирования вынуть из компьютера старый физический диск и загрузиться в новый хотя бы один раз (чтоб винда обновила MountedDevices). Потом можно вставить старый диск обратно. Такой же трюк можно проделать даже с разделами на одном физическом диске: просто временно удалить старый раздел, а потом восстановить его обратно (ясно, что делать это нужно крайне осторожно). Ну и конечно же, всё это не проверялось :))
  • Смонтировать реестр Windows в GNU/Linux как winregfs

И наконец: использовать разные программы для копирования/бекапов разделов (типа Acronis) бесполезно: все они не меняют реестр (скорее всего), поэтому работать в такой ситуации (копирование винды в пределах одного компа) не будут.

И ещё: весь материал этого раздела проверялся только на Windows XP.

В Windows XP его аналог — это файл boot.ini в корне раздела с Windows, а в Windows 7 — это Windows Boot Manager.

В стандартном интерпретаторе (то есть в cmd.exe) есть много разных фич типа ветвления, так же, как и в UNIX'овых интерпретаторах. Там даже есть дебаговый вывод (а-ля set -x ), а именно echo on , правда он включен по дефолту и обычно первым действием в скрипте его отключают ( echo off , разумеется).

Вообще, виндовая команда echo крайне непоследовательна: её действие довольно странным образом зависит от аргумента:

cmd.exe bash
echo foo echo foo
echo on set -x
echo off set +x
echo shopt -o xtrace

После лицезрения этой таблицы все юниксоиды, конечно же, схватились за голову и сказали: «Что за идиоты проектировали винду?» Впрочем, в UNIX'е тоже не всё гладко: с какой стати set -x включает дебаг, а set +x выключает его. То же самое относится к остальным режимам, включаемым командой set.

Ах да, я же обещал мощный командный интерпретатор. :) cmd.exe таковым, конечно же, не является. А вот PowerShell — является. Одной из особенностей PowerShell'а является то, что он «понимает» обычные UNIX'овые команды, например, ls. Правда, на самом деле эта команда похожа на UNIX'овую лишь своим названием и идеей, опции у этого ls всё равно совсем другие. ls — это всего лишь один из алиасов на Get-ChildItem. А ещё в винде есть полноценный IDE для написания PowerShell-скриптов с визуальным отладчиком! Вы можете себе такое представить в UNIX'е? Да, есть конечно bashdb, но визуальный отладчик, конечно же, удобнее.

Спасибо Evgeny_Shiryaev, 6opoDuJIo, amdf, easyman, EndUser, risik, NoOne и aik за ценные замечания и исправления ошибок.

Читайте также: