Я играл с 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
команды?
TL; DR:
cat
читает из файлов, имена которых вы передаете, ноtee
пишет в них. Только когда вы не передаете им имена файлов, они имеют тот же эффект. В противном случае использованиеtee
, когда вы имеете в видуcat
, может перезаписать файлы, которые вы хотели прочитать, что приведет к случайной потере данных.
cat
и tee
ведут себя одинаково, когда вы не указываете им имена файлов. Вот что происходит в вашем примере; команды имеют перенаправления вывода (>
), но не содержат реальных аргументов командной строки. Когда вы передаете имена команд cat
и tee
, они ведут себя по-разному, и вы можете даже случайно перезаписать файлы и потерять данные, передав их имена в tee
, когда вы намеревались передать их в cat
.
Причины cat
и tee
делают одно и то же без всяких аргументов, но разные вещи с именами файлов, передаваемыми в качестве аргументов, можно определить, рассматривая поведение каждого из них. В целом они ведут себя почти противоположно. cat
читает потенциально много файлов и отправляет их вывод в одно место, в то время как tee
читает один ввод и отправляет его потенциально много файлов.
cat
копирует содержимое всех своих входных файлов в стандартный вывод , один за другим. Это означает, что он объединяет файлы. Например, cat x y
выводит содержимое x
, за которым следует содержание y
. Когда передается одно имя файла, он копирует содержимое этого файла в стандартный вывод и затем, так как у него больше нет аргументов, останавливается.
Когда вы запускаете cat
с без имен файлов, по умолчанию он читает из своего собственного стандартного ввода . По сути, это означает, что он читает все, что направлено или перенаправлено на него, или что-то еще, что введено в терминал. (Другой способ выразить это в том, что без имен файлов cat
ведет себя подобно cat -
, поскольку cat
, , как и другие команды , специально обрабатывает -
и использует его для обозначения стандартного ввода .)
tee
копирует содержимое своего стандартного ввода во все свои выходные файлы , а также свой собственный стандартный вывод , Это означает, что он функционирует как T-переход - или, точнее, N T-переход, где N - количество выходных файлов, чьи имена, которые вы передаете ему. Например, 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
или tee
без аргументов для этой цели, если вы используете cat
, тогда люди поймут, что вы имеете в виду. tee
без аргументов хорошо, но это выглядит как ошибка 1171. Иногда это описывается тем, что cat
является идиоматическим способом .
Отметим также, что параметры командной строки, поддерживаемые cat
и tee
, различны. Вы, вероятно, ожидаете этого, так как они в основном делают разные вещи и, следовательно, способны настроить свое поведение совершенно по-другому. См. man cat
и man tee
для подробностей, особенно об этом.