linux.exex [GFYB]
156 subscribers
748 photos
87 videos
9 files
554 links
GFYB - go fuck yourself bitch. This Is team GFYB. goida
Download Telegram
нихуя
🧠 Linux tip: namei

Есть команда, о которой часто забывают: namei.

Она раскладывает путь по компонентам и показывает права на каждом уровне:

namei -l /var/www/site/index.html

Это удобно, когда файл существует, права на нём нормальные, но nginx или приложение всё равно получает Permission denied. Проблема часто не в самом файле, а в одной из родительских папок.

Если дебажишь доступы в Linux, namei экономит много времени.

📍 Подпишись на создателей: https://t.me/linuxexex
🔐 Linux security: проверь SSH-доступ

Минимальный чек-лист для сервера:

1. Отключить вход root по SSH:
PermitRootLogin no

2. Отключить парольный вход, если используешь ключи:
PasswordAuthentication no

3. Проверить, кто вообще может логиниться:
AllowUsers your_user

После изменения конфига не закрывай текущую SSH-сессию сразу. Сначала открой вторую и проверь вход.

Так ты не заблокируешь сам себя из-за опечатки.

📍 Подпишись на создателей: https://t.me/linuxexex
📰 Ешь салат. С салатом всё в порядке.

FDA Трампа делает вид, что проводит серьёзное расследование — уже после того, как Трамп получил взятку от Taylor Farms.

Вокруг продолжающейся вспышки циклоспороза в понедельник возникла путаница: поставщик продуктов питания, связанный с заболеванием, вступил в конфликт с Управлением по санитарному надзору за качеством пищевых продуктов и медикаментов (FDA).

Чиновники FDA заявили на пресс-конференции в понедельник, что расследование по-прежнему указывает на листовой салат айсберг компании Taylor Farms как на источник вспышки. Это несмотря на то, что компания утверждает: агентство принесло ей официальные извинения за объявление ложноположительного результата теста на циклоспору в их салате.

«Мы не приносили официальных извинений, но фактически разъяснили возникшие вопросы», — заявил представитель FDA.

Taylor Farms — многонациональный гигант по поставкам продуктов питания — оказался в центре истории со вспышкой паразита, вызывающего диарею, после того как Центры по контролю и профилактике заболеваний (CDC) отследили сообщения о болезни до салата-айсберга Taylor Farms de Mexico, который подавали в заведениях Taco Bell в пяти штатах. В пятницу поставщик объявил добровольный отзыв айсберга из центральной Мексики, включая фасованные салатные миксы из продуктовых магазинов.

В выходные FDA сначала объявило, а затем отозвало новость о том, что образец салата Taylor Farms дал положительный результат на циклоспору. Этот тест оказался ложноположительным — то есть агентство так и не обнаружило никаких «подтверждённых положительных результатов при тестировании продуктов на циклоспору», говорится в заявлении FDA.

Источник (4chan /news/): https://boards.4chan.org/news/thread/1524686

📍 Подпишись на создателей: https://t.me/linuxexex
Лайфхак для терминала, который реально экономит время ⚡

Многие знают про Ctrl+R — обратный поиск по истории. Но есть кое-что помощнее, и большинство про это не знает.

Называется fzf — fuzzy finder для командной строки. Устанавливается за секунду:

# Debian/Ubuntu
apt install fzf

# Arch
pacman -S fzf

# macOS
brew install fzf

После установки жмёшь Ctrl+R — и вместо стандартного поиска получаешь интерактивный список всей истории с нечётким поиском. Начинаешь набирать любую часть команды — список фильтруется на лету. Не надо помнить точное начало команды, достаточно вспомнить любое слово из неё.

Но это только начало. Вот где начинается магия:

Ctrl+T — вставить путь к файлу прямо в текущую команду. Набираешь vim, жмёшь Ctrl+T, выбираешь файл из интерактивного дерева — готово.

Alt+C — моментально перейти в любую папку. Не надо помнить полный путь, просто набираешь кусок названия.

Можно использовать fzf в пайпах. Например выбрать процесс для kill:

kill -9 $(ps aux | fzf | awk '{print $2}')

Или выбрать ветку git для переключения:

git checkout $(git branch | fzf)

Или открыть любой файл в проекте:

vim $(find . -type f | fzf)

Последнее вообще убивает необходимость помнить структуру проекта целиком.

Ещё одна вещь, про которую забывают — двойные восклицательные знаки !! в bash. Это псевдоним для последней команды. Забыл написать sudo? Не надо стрелку вверх давить и идти в начало строки:

sudo !!

Просто выполнит предыдущую команду с sudo. Работает везде без установки чего-либо.

И совсем простое, но удивительно полезное — Ctrl+W удаляет одно слово назад. Если написал длинную команду с ошибкой в последнем аргументе, не надо держать Backspace — одно нажатие и слово стёрто.

Терминал это не про скорость печати, это про то чтобы не делать лишних движений 🖥️

📍 Подпишись на создателей: https://t.me/linuxexex
📰 Биде — экологично и нежно для попы?

Биде лучше для экологии и для прямой кишки, чем туалетная бумага?

Обычная туалетная бумага — это трата ресурсов. Плюс она раздражает мой анус.

Источник (4chan /sci/): https://boards.4chan.org/sci/thread/17009533

📍 Подпишись на создателей: https://t.me/linuxexex
Зiвтрiк 🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
Как Linux решает, кому дать процессор прямо сейчас

Представь: у тебя 8 ядер и 300 процессов. Кто работает, а кто ждёт? Этим занимается планировщик задач — одна из самых интересных подсистем ядра.

С 2007 года в Linux живёт CFS — Completely Fair Scheduler. Название говорит само за себя: он пытается быть честным. Но как именно?

Главная идея — виртуальное время

CFS не думает категориями «дай процессу 10 миллисекунд». Вместо этого он ведёт для каждого процесса счётчик vruntime — виртуальное время выполнения. Чем дольше процесс уже работал, тем больше его vruntime.

Логика простая: всегда запускай того, у кого vruntime наименьший. То есть того, кто меньше всего получил процессорного времени.

Красно-чёрное дерево вместо очереди

Все запущенные процессы хранятся в красно-чёрном дереве — это самобалансирующаяся структура данных. Ключ — тот самый vruntime. Самый «голодный» процесс всегда крайний левый узел дерева.

Планировщик просто берёт левый узел, запускает процесс, обновляет vruntime — и снова кладёт в дерево уже на другое место. Вставка и поиск за O(log n). Элегантно.

А что с приоритетами?

Приоритет (nice value, от -20 до +19) влияет на скорость роста vruntime. У важного процесса vruntime растёт медленнее — значит, он чаще оказывается «самым голодным» и получает больше времени. Никакой магии, просто математика.

Период и гранулярность

CFS работает с понятием целевой задержки — примерно 6 миллисекунд по умолчанию. За это время каждый активный процесс должен хоть раз поработать. Если процессов много, минимальный квант не даёт нарезать время слишком мелко — иначе ядро будет только переключаться и ничего не делать.

Почему это круто

До CFS в Linux был O(1) scheduler — он работал быстро, но интерактивность страдала. Браузер мог подвисать, потому что планировщик не умел хорошо отличать «жду ввода от пользователя» от «считаю что-то тяжёлое».

CFS решил это элегантно: процессы, которые часто спят (ждут клавиатуру, сеть), накапливают маленький vruntime. Когда они просыпаются — сразу оказываются в начале очереди и получают процессор почти мгновенно. Отсюда отзывчивость десктопа.

Сейчас в ядре 6.6+ появился EEVDF — наследник CFS с более честной математикой, но принцип тот же: виртуальное время и честное распределение.

Планировщик — это несколько тысяч строк кода в kernel/sched/fair.c, которые незаметно делают так, чтобы твой терминал отвечал быстро, пока в фоне компилируется ядро 😄

📍 Подпишись на создателей: https://t.me/linuxexex
📰 Учёные изучили, как длинноцепочечные полиненасыщенные жирные кислоты распределяются в пищевых цепях пресноводных рыб Европы

Систематический обзор исследовал пространственно-временное распределение длинноцепочечных полиненасыщенных жирных кислот (LC-PUFA) в пищевых сетях европейских пресноводных озёр и прудов — в той их части, которая фильтруется через жабры рыб.

LC-PUFA, в частности омега-3 кислоты EPA и DHA, критически важны для здоровья водных экосистем и самих рыб. Они синтезируются преимущественно микроводорослями и фитопланктоном, затем передаются по пищевой цепи — от зоопланктона к рыбам.

Исследование охватывает европейские пресноводные водоёмы и анализирует, как концентрация этих веществ меняется в зависимости от сезона, географии и типа экосистемы. Это важно для понимания того, насколько пресноводные рыбы способны обеспечивать людей качественными омега-3 жирными кислотами — особенно на фоне изменения климата и эвтрофикации водоёмов, которые влияют на состав фитопланктона и, следовательно, на доступность LC-PUFA во всей пищевой цепи.

Источник (r/science): https://www.reddit.com/r/science/comments/1v6xq62/spatiotemporal_distribution_of_longchain/

📍 Подпишись на создателей: https://t.me/linuxexex
У меня др седня кста
watch — команда, о которой забывают, но зря

Большинство линуксоидов знают top, htop, tail -f. Но есть одна простая штука, которую почему-то игнорируют — команда watch.

Что она делает: запускает любую команду повторно через заданный интервал и показывает результат прямо в терминале. Живое обновление без скриптов и циклов.

Базовое использование:

watch df -h

Это будет каждые 2 секунды показывать состояние дисков. Никакого скрипта, никакого while true.

Полезные флаги:

-n — задать интервал в секундах
watch -n 5 free -m
обновляет каждые 5 секунд, смотрим память

-d — подсвечивает изменения между обновлениями
watch -d netstat -an
сразу видно, что поменялось в сетевых соединениях

-t — убирает шапку с временем и командой, если мешает

-e — останавливает выполнение, если команда вернула ошибку

Реальные сценарии где это реально спасает:

Следишь за размером лога в реальном времени:
watch -n 1 'ls -lh /var/log/syslog'

Мониторишь очередь задач:
watch -n 3 'ps aux | grep python'

Ждёшь когда файл появится в директории:
watch -n 2 'ls /tmp/ | grep backup'

Смотришь как меняется температура процессора:
watch -n 1 sensors

Проверяешь статус сервиса пока что-то деплоишь:
watch systemctl status nginx

Одна тонкость: watch запускает команду через sh -c, поэтому алиасы из вашего .bashrc там не работают. Если нужен алиас — передавай явно строкой или используй функцию.

Ещё момент — минимальный интервал 0.1 секунды. Можно делать почти real-time мониторинг без написания ни строчки кода.

watch есть в procps-ng, стоит практически везде из коробки. На macOS ставится через brew install watch.

Простая команда, но когда знаешь о ней — перестаёшь писать дурацкие циклы в bash ради банального мониторинга 🖥️

📍 Подпишись на создателей: https://t.me/linuxexex
2020 - 2022 - 2024 - 2026?????
Лайфхак для терминала, который реально экономит время ⚡

Вы знаете про Ctrl+R — поиск по истории команд. Но большинство людей используют его неправильно: нажал, начал вводить, получил одну команду, вышел. Всё.

А теперь настоящий трюк.

Установите fzf — это fuzzy finder для командной строки. После установки он перехватывает Ctrl+R и превращает поиск по истории в интерактивный список с нечётким поиском.

Например, помните что запускали что-то с docker compose и каким-то длинным флагом — но не помните точно что. Жмёте Ctrl+R, вводите "dock comp", и fzf мгновенно показывает все подходящие команды из истории. Стрелками выбираете нужную, Enter — и она уже в строке ввода.

Установка на Ubuntu/Debian:

sudo apt install fzf

На macOS:

brew install fzf

После установки нужно подключить интеграцию с шеллом. Для bash и zsh:

$(brew --prefix)/opt/fzf/install

или на Linux:

/usr/share/doc/fzf/examples/key-bindings.bash

Добавьте source этого файла в .bashrc или .zshrc.

Но это ещё не всё. fzf работает не только с историей команд. Нажмите Ctrl+T в терминале — получите интерактивный поиск файлов прямо во время набора команды. Пишете vim, жмёте Ctrl+T, находите файл — путь вставляется автоматически.

А команда **cd + Alt+C** открывает интерактивный выбор директории для перехода.

Ещё один момент: по умолчанию история bash хранит 500 команд. Это смешно. Добавьте в .bashrc:

HISTSIZE=100000
HISTFILESIZE=200000
HISTCONTROL=ignoredups:erasedups

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

Звучит как мелочь, но когда каждый день работаешь в терминале — это десятки минут, которые перестают уходить на вспоминание и перепечатку. 🖥️

📍 Подпишись на создателей: https://t.me/linuxexex
Вот фишка, которую я сам узнал позже, чем следовало бы.

В bash и zsh есть встроенная замена подстрок прямо в переменных — без sed, без awk, без лишних процессов.

Допустим, у тебя есть строка:

file="hello_world_2024.log"

Хочешь заменить первое вхождение подстроки:

echo "${file/world/linux}"
→ hello_linux_2024.log

Хочешь заменить все вхождения — добавляешь второй слэш:

text="aaa bbb aaa"
echo "${text//aaa/xxx}"
→ xxx bbb xxx

Это работает в bash и zsh без вызова внешних утилит. Быстро, чисто, и никакого fork().

Но это ещё не всё.

Можно удалить подстроку, просто не указывая замену:

echo "${file/2024/}"
→ hello_world_.log

Можно работать с началом и концом строки. Одна решётка — удалить минимальный префикс, две — максимальный:

path="/usr/local/bin/bash"
echo "${path#*/}" → usr/local/bin/bash
echo "${path##*/}" → bash

Процент работает так же, но с конца:

echo "${path%/*}" → /usr/local/bin
echo "${path%%/*}" → (пусто, срезало всё)

Это активно используют в скриптах для работы с путями и расширениями файлов — без dirname и basename:

file="archive.tar.gz"
echo "${file%%.*}" → archive
echo "${file##*.}" → gz

Ещё один трюк — изменение регистра (zsh и bash 4+):

str="hello world"
echo "${str^^}" → HELLO WORLD
echo "${str,,}" → hello world

А вот для первой буквы:

echo "${str^}" → Hello world

Это всё POSIX-расширения parameter expansion — встроены в сам шелл, документированы в man bash в разделе Parameter Expansion. Большинство людей знают про ${var:-default} и на этом останавливаются.

Почему это важно? В скриптах каждый вызов sed или awk — это отдельный процесс. Если ты в цикле обрабатываешь тысячи строк, разница в скорости будет ощутимой. Встроенные операции работают в памяти без форка.

Сохрани себе, пригодится при следующем скрипте 🐚

📍 Подпишись на создателей: https://t.me/linuxexex
Ставим веб-сервер на пяти дистрибутивах — смотрим, кто удобнее

Задача простая: поднять nginx, добавить его в автозапуск и проверить статус. Казалось бы, одно и то же везде. Но дьявол в деталях.

Ubuntu 24.04
apt install nginx, systemctl enable --now nginx — и всё. Nginx уже в репозитории свежий, firewall не мешает (ufw по умолчанию выключен), браузер открывает страницу сразу. Для новичка — идеально. Для сервера — тоже норм, пока не нужен тонкий контроль.

Debian 12
Почти то же самое, но nginx в stable чуть старше. Зато система минималистичная: ставишь ровно то, что просил, ничего лишнего. AppArmor присутствует, но не мешает базовой установке. Предсказуемость и стабильность — главные козыри.

Fedora 40
dnf install nginx, потом systemctl enable --now nginx — и тут сюрприз. firewalld работает по умолчанию и 80 порт закрыт. Нужно явно открыть: firewall-cmd --permanent --add-service=http && firewall-cmd --reload. Новичок споткнётся, опытный оценит, что безопасность из коробки серьёзнее. Nginx здесь самый свежий из всех пяти.

AlmaLinux 9
Это RHEL-клон для тех, кто хочет «как на продакшене в энтерпрайзе». nginx надо сначала включить модуль или добавить репозиторий, потому что в базовом реп он постарше. SELinux включён и работает — если положить конфиг в нестандартное место, nginx тихо упадёт и будет смотреть на тебя с укором. Надо разбираться с контекстами. Зато потом понимаешь, почему крупные компании это любят.

Arch Linux
pacman -S nginx, systemctl enable --now nginx — пакет свежайший. Никакого лишнего слоя абстракции. Но Arch не держит тебя за руку: нет автонастройки firewall, нет подсказок, документация — это вики, и она реально хорошая. Зато полный контроль над каждым шагом. Если хочешь понять, как оно работает изнутри — лучший вариант для обучения.

Итого по ощущениям

Быстрее всего взлетело на Ubuntu — ноль сюрпризов.
Самый свежий пакет — Arch и Fedora.
Самый высокий порог входа из-за безопасности — AlmaLinux с SELinux.
Самый предсказуемый и тихий — Debian.
Лучший для понимания происходящего — Arch.

Выбор дистрибутива — это во многом выбор того, сколько системы ты хочешь видеть. Ubuntu прячет детали, Arch показывает всё. Остальные где-то посередине, каждый со своим акцентом.

Под какие задачи ты выбираешь дистрибутив? 👇

📍 Подпишись на создателей: https://t.me/linuxexex
📰 Хронические финансовые проблемы связаны с ускоренным старением мозга

Новое исследование показало: люди, которые на протяжении длительного времени испытывали финансовые трудности или стабильно низкий доход в молодом и среднем возрасте, к 53 годам показывали худшие результаты в когнитивных тестах.

Иными словами, постоянная нехватка денег — это не только стресс здесь и сейчас. Это удар по мозгу в долгосрочной перспективе. Причём важна именно хроничность: не разовые финансовые трудности, а затяжные, годами тянущиеся проблемы с деньгами.

Учёные разделяют два фактора: объективно низкий доход и субъективное ощущение финансовой нестабильности. Оба оказались связаны с ухудшением когнитивных функций — памяти, скорости мышления, способности концентрироваться.

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

Источник (r/science): https://www.reddit.com/r/science/comments/1v72m2a/persistent_money_struggles_linked_to_faster_brain/

📍 Подпишись на создателей: https://t.me/linuxexex
tee — команда, о которой забывают, но она реально выручает

Все знают про перенаправление вывода через >. Записал в файл — и дальше работаешь. Но что если нужно одновременно видеть вывод в терминале И писать его в файл? Вот тут большинство начинают городить костыли.

А можно просто использовать tee.

Базовый пример:

ping google.com | tee ping_log.txt

Всё, что пишет ping — идёт и на экран, и в файл одновременно. Никакой магии, просто удобно.

Дописать в файл, не затирая старое:

some_command | tee -a log.txt

Флаг -a работает как >> — дописывает в конец.

Писать сразу в несколько файлов:

echo "deploy started" | tee deploy.log backup.log

Оба файла получат одинаковое содержимое. Можно передать сколько угодно имён.

Запись в защищённый файл через sudo:

Вот это реально полезная штука. Классическая ошибка новичка:

sudo echo "something" > /etc/protected_file

Это не работает — перенаправление выполняется от имени текущего пользователя, а не root. А вот так работает:

echo "something" | sudo tee /etc/protected_file

Если не хочешь видеть вывод на экране при этом — добавь > /dev/null в конец.

Ещё один сценарий — логирование сборок и деплоев. Запускаешь скрипт, хочешь видеть прогресс и одновременно сохранять лог:

./build.sh | tee build_$(date +%F).log

После сборки у тебя готовый файл с датой в названии и ты всё видел в реальном времени.

tee встроена в GNU coreutils, есть везде — Linux, macOS, BSD. Маленькая, без сюрпризов, делает ровно то что говорит.

Одна из тех команд, которые узнаёшь — и потом удивляешься, как раньше без неё обходился.

📍 Подпишись на создателей: https://t.me/linuxexex
Как работает планировщик процессов в Linux — и почему это вообще важно

Твой ноутбук запускает браузер, музыку, терминал и ещё пятьдесят фоновых процессов одновременно. Но ядро у тебя одно, ядер процессора — допустим, четыре. Кто решает, кому из тысячи процессов дать время на выполнение прямо сейчас? Планировщик.

Суть простая: процессор может делать только одно дело в конкретный момент времени. Задача планировщика — нарезать это время на крошечные куски и раздавать их процессам по очереди, так быстро, что тебе кажется, будто всё работает параллельно. Это называется вытесняющая многозадачность.

Как он выбирает, кому дать CPU?

В Linux уже давно используется CFS — Completely Fair Scheduler. Название говорящее: он пытается быть честным. Идея в том, чтобы каждый процесс получил примерно одинаковое реальное время процессора с учётом своего приоритета.

CFS не работает с очередями в классическом смысле. Он хранит все запущенные задачи в красно-чёрном дереве, где ключ — виртуальное время выполнения процесса (vruntime). Чем меньше vruntime, тем меньше процесс успел поработать, значит он стоит ближе к левому краю дерева. Планировщик всегда берёт крайний левый узел — того, кто ждал дольше всех.

Когда процесс поработал своё время (таймслот), его vruntime увеличивается, он уходит правее в дереве, и на смену приходит следующий претендент. Всё это происходит за микросекунды.

А приоритеты?

Приоритет в Linux называется nice-значение, от -20 (максимум наглости) до 19 (максимально уступчивый). Чем ниже nice, тем медленнее растёт vruntime у процесса — то есть он чаще оказывается крайним слева и получает больше CPU. Не грубой силой, а математикой.

Есть ещё отдельный класс задач реального времени — SCHED_FIFO и SCHED_RR. Они вообще живут вне CFS и имеют абсолютный приоритет. Используются для аудио, промышленного управления, всего, где задержка критична.

Что происходит при переключении контекста?

Когда планировщик решает сменить задачу, ядро сохраняет состояние текущего процесса: регистры, указатель стека, счётчик команд — всё это в структуре task_struct. Потом загружает сохранённое состояние следующего процесса и передаёт ему управление. Для тебя это невидимо, но каждое такое переключение стоит времени — десятки микросекунд. Поэтому слишком частые переключения вредны, планировщик старается давать разумный таймслот.

Кстати, с появлением многоядерных систем задача усложнилась: нужно не только распределять время, но и решать, на каком ядре запускать процесс. Лучше на том, где он работал в прошлый раз — данные ещё могут быть в кэше (cache affinity). Планировщик учитывает и это.

В ядре 6.6 появился EEVDF — новый алгоритм на замену CFS, ещё более честный и с лучшей работой с латентностью. Эволюция не останавливается.

Итог: планировщик — это сердце многозадачности. Ты никогда не думаешь о нём, пока он работает правильно. И это, наверное, лучший комплимент для системного кода 🐧

📍 Подпишись на создателей: https://t.me/linuxexex
🧩 Как systemd запускает сервисы простыми словами

systemd читает unit-файлы, понимает зависимости и запускает сервисы в нужном порядке.

Например, если приложению нужна сеть, unit может указать:

After=network-online.target

Главные команды:
systemctl status nginx — состояние сервиса
systemctl restart nginx — перезапуск
journalctl -u nginx -f — живые логи

systemd не просто «запускает демоны». Он ещё следит за процессами, логирует, рестартит при падении и помогает понять, почему сервис не поднялся.

📍 Подпишись на создателей: https://t.me/linuxexex
🚀 Bash/Zsh: быстро заменить ошибку в прошлой команде

Опечатался в предыдущей команде? Не обязательно переписывать всё заново.

Можно сделать так:

^stauts^status

Shell повторит прошлую команду, заменив первый фрагмент на второй.

Пример:
git stauts
^stauts^status

Мелочь, но в терминале такие мелочи складываются в скорость.

📍 Подпишись на создателей: https://t.me/linuxexex
tee — труба с раздвоением

Все знают пайпы в Linux. Гонишь вывод одной команды в другую — красота. Но иногда хочется одновременно и в файл записать, и дальше по трубе пустить. Вот тут и приходит tee.

Название — от буквы T, форма которой буквально описывает что происходит: поток данных идёт прямо и одновременно ответвляется в сторону.

Простой пример:

ls -la | tee output.txt | grep ".sh"

Что произошло: вывод ls записался в output.txt И при этом ушёл дальше в grep. Без tee пришлось бы делать два отдельных вызова или городить костыли.

Несколько полезных флагов:

-a (append) — не перезаписывает файл, а дописывает в конец. Незаменимо для логов.

./deploy.sh | tee -a deploy.log | grep "ERROR"

Следишь за ошибками в реальном времени и лог копится — удобно.

Запись в несколько файлов сразу — просто перечисляешь их:

echo "привет" | tee file1.txt file2.txt file3.txt

Все три файла получат одинаковое содержимое.

Хитрый трюк с sudo — когда надо записать в системный файл, но редиректом это не выйдет:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.conf

Классическая ошибка новичков — написать sudo echo ... > /etc/sysctl.conf. sudo применяется к echo, а редирект > выполняется от текущего пользователя. Получаешь "Permission denied". С tee — работает, потому что именно tee запускается с правами root и пишет в файл.

Можно подавить вывод в терминал, если нужна только запись в файл, и дальнейшая обработка через пайп — перенаправляешь в /dev/null:

command | tee output.txt > /dev/null

Не самый частый сценарий, но бывает нужен в скриптах.

tee есть везде — Linux, macOS, BSD. Входит в GNU Coreutils, так что никаких установок не нужно. Одна из тех команд, про которую не думаешь неделями, а потом однажды вспоминаешь — и она решает задачу за три секунды.

linux.exe

📍 Подпишись на создателей: https://t.me/linuxexex