
Наткнувшись примерно на три tee
объяснения, которые я счел недидактичными, я бы попросил дать простое, общее и пошаговое (если возможно) объяснение этой команды, предназначенное для новичков в Linux.
Я понимаю, что мы используем его либо через конвейер, либо через стандартный вывод команды, либо, в качестве альтернативы, напрямую через определенный файл, но мне кажется, я не понимаю, что команда на самом деле делает с этим контентом и когда это полезно.
Итак, вот что я спрашиваю, надеясь найти дидактическое объяснение, представленное новичкам в ясной и пошаговой форме:
Как команда работает либо со стандартным выводом команды, либо с самими файлами?
Почему принято говорить,
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
). Я хотел бы сохранить вывод всего процесса сборки, включая любые ошибки или предупреждения, но я не хочу, чтобы все выплескивалось в мой терминал. Для этого я использую tee
to save everything into build.out
и затем grep
получаю только подсказку о том, в какой части процесса мы находимся в терминале.
См. также другие вопросы здесь, помеченные тегомтройникярлык.