Я игрался с 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
записывает в них. Только когда вы не передаете им имена файлов, они имеют тот же эффект. В противном случае использованиеtee
when you meancat
может перезаписать файлы, которые вы намеревались прочитать, что приведет к случайной потере данных.
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
, в противном случае он перезаписывает текущее содержимое новым вводом.