Как работает команда «ти»?

Как работает команда «ти»?

Наткнувшись примерно на три teeобъяснения, которые я счел недидактичными, я бы попросил дать простое, общее и пошаговое (если возможно) объяснение этой команды, предназначенное для новичков в Linux.

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

Итак, вот что я спрашиваю, надеясь найти дидактическое объяснение, представленное новичкам в ясной и пошаговой форме:

  1. Как команда работает либо со стандартным выводом команды, либо с самими файлами?

  2. Почему принято говорить, teeчто читает стандартный ввод? Я имею в виду, если я это делаю ls -l, teeто не читает сам синтаксис ls -l, а скорее stdout, который он вывел в сеанс.

Также, если хотите, поделитесь, пожалуйста, практическим примером из вашей повседневной работы, когда teeэто может быть для вас очень полезно?

решение1

Из teeруководства к моей системе:

Утилита tee копирует стандартный ввод в стандартный вывод, создавая копию в ноль или более файлов. Вывод не буферизуется.

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

В следующем конвейере teeбудет взят вывод первой команды в конвейере и скопирован в стандартный вывод (терминал), а также будут созданы его копии в файлах one, twoи three:

$ somecommand | tee one two three

teeимеет много применений, одно из которых связано с sudoперенаправлением вывода в файл, принадлежащий пользователю root:

$ somecommand | sudo tee /root/somefile >/dev/null

Следующее будетнетсработало, поскольку перенаправление происходит от имени непривилегированного пользователя (оно также будет запущено somecommandот имени root, что может быть нежелательным):

$ sudo somecommand >/root/somefile

Искусственный пример добавления фиксированного набора строк ко многим файлам одновременно (ко всем ~/.profileфайлам пользователей, предполагая, что *расширяется до имен пользователей и что расширенная командная строка не становится слишком длинной для обработки оболочкой):

$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH

Реальный пример использования tee:

time doas box-build.sh 2>&1 | tee build.out |  grep '^=*>'

Это я создаю базовую систему OpenBSD doas.«эквивалент» OpenBSDsudoи box-build.shэто небольшой скрипт оболочки, который выполняет сборку (по сути cd /usr/src && make obj && make build). Я хотел бы сохранить вывод всего процесса сборки, включая любые ошибки или предупреждения, но я не хочу, чтобы все выплескивалось в мой терминал. Для этого я использую teeto save everything into build.outи затем grepполучаю только подсказку о том, в какой части процесса мы находимся в терминале.

См. также другие вопросы здесь, помеченные тегомярлык.

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