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

Я играл с 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
задан 24 June 2019 в 17:24

1 ответ

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

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

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

cat

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 для подробностей, особенно об этом.

2
ответ дан 24 June 2019 в 17:24

Другие вопросы по тегам:

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