В чем разница между cat и tee?

В чем разница между cat и tee?

Я игрался с Apache php.iniи добился того, что когда я отправляю письма с помощью PHP-файла, который имеет эту mail()функцию, он сохраняет письмо на моем компьютере, что хорошо для тестирования и веб-разработчиков. Вот строка кода, которую я добавил в php.ini:

sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

Эта строка кода тоже сработала:

sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

В чем разница между командами catи tee?

решение1

TL;DR: catчитает из файлов, имена которых вы ему передаете, но teeзаписывает в них. Только когда вы не передаете им имена файлов, они имеют тот же эффект. В противном случае использование teewhen you mean catможет перезаписать файлы, которые вы намеревались прочитать, что приведет к случайной потере данных.

catи teeведут себя одинаково, когда вы не даете им никаких имен файлов. Это то, что происходит в вашем примере; команды имеютперенаправления вывода( >) но нет фактических аргументов командной строки. Когда вы передаете имена файлов командам catи tee, они ведут себя по-разному, и вы даже можете случайно перезаписать файлы и потерять данные, передав их имена в , teeкогда вы хотели передать их в cat.

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

кот

catкопирует содержимое всех своих входных файлов встандартный вывод, один за другим. Это означает, что он объединяет файлы. Например, cat x yвыводит содержимое , xза которым следует содержимое y. При передаче одного имени файла он копирует содержимое этого файла в стандартный вывод, а затем, поскольку у него больше нет аргументов, останавливается.

Когда вы бежите catснетимена файлов, по умолчанию он считывает их из своих собственныхстандартный ввод. По сути, это означает, что он читает все, что угодно.трубчатыйилиперенаправленок нему, или иным образом то, что вводится в терминал. (Другим способом выразить это является то, что без имен файлов catведет себя как cat -, поскольку cat,как и различные другие команды, обрабатывает его -особым образом и принимает его для обозначения стандартного ввода.)

тройник

teeкопирует содержимое своего стандартного входного потока во все свои выходные файлыа также свой собственный стандартный вывод. Это означает, что он функционирует какТ-образный перекресток--или, точнее,НТ-образные перекрестки, гдеНэто количество выходных файлов, имена которых вы ему передаете. Например, tee xсчитывает свой ввод, записывает его в файл x, а также записывает его в свой собственный стандартный вывод. tee x yсчитывает свой ввод, записывает его в файл xитакжев файл y, а также записывает его в свой собственный стандартный вывод.

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

teeперезаписывает файлы, имена которых вы ему даете, если только вы не передадите ему опцию -a, в этом случае он добавляется к ним. Например, чтобы добавить к этому журналу вместо того, чтобы перезаписывать его, вы можете использовать foo | tee -a logfile | bar.

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

Культура отдает предпочтение cat, когда вам просто нужно скопировать stdin в stdout.

Хотя вы можете использовать для этой цели либо , catлибо teeбез аргументов, если вы используете , catто люди поймут, что вы имеете в виду. teeбез аргументов это нормально, но этовыглядиткак ошибка. Иногда это описывается так: catэтоидиоматическийспособ сделать это.

Обратите внимание также, что параметры командной строки, поддерживаемые catи teeразличны. Вы, вероятно, ожидали этого, поскольку они в основном выполняют разные функции, и, таким образом, могут настраивать свое поведение совершенно по-разному. Смотритеman catиman teeдля получения подробной информации, особенно по этому вопросу.

решение2

Вкратце cat- для чтения (ручной вводифайлы) и запись (с >и >>) в файлы. И teeтолько о записи в файлы - но водновременнов соответствии с выводом команды, которая обслуживает ее ввод.

Например:

  • ping 192.168.1.xx | tee [-a] ping_report.txt

С помощью команды, показанной выше, вы можетеодновременносм. вывод pingкомандыиэтот вывод будет записан в ping_report.txtфайл (конечно, для последующего анализа). Если -aпараметр используется, то ввод (вывод первой команды) добавляется к файлу ping_report.txt, в противном случае он перезаписывает текущее содержимое новым вводом.

Связанный контент