🧠 Linux tip: namei
Есть команда, о которой часто забывают: namei.
Она раскладывает путь по компонентам и показывает права на каждом уровне:
namei -l /var/www/site/index.html
Это удобно, когда файл существует, права на нём нормальные, но nginx или приложение всё равно получает Permission denied. Проблема часто не в самом файле, а в одной из родительских папок.
Если дебажишь доступы в Linux, namei экономит много времени.
📍 Подпишись на создателей: https://t.me/linuxexex
Есть команда, о которой часто забывают: 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
Минимальный чек-лист для сервера:
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
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
boards.4chan.org
/news/ - Eat the Lettuce. The Lettuce is Fine. - Current News - 4chan
Eat the Lettuce. The Lettuce is Fine. - "/news/ - Current News; is 4chan's board for current news.
Лайфхак для терминала, который реально экономит время ⚡
Многие знают про 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
Многие знают про 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
Биде лучше для экологии и для прямой кишки, чем туалетная бумага?
Обычная туалетная бумага — это трата ресурсов. Плюс она раздражает мой анус.
Источник (4chan /sci/): https://boards.4chan.org/sci/thread/17009533
📍 Подпишись на создателей: https://t.me/linuxexex
boards.4chan.org
/sci/ - Bidet - Science & Math - 4chan
Bidet - "/sci/ - Science & Math" is 4chan's board for the discussion of science and math.
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
Представь: у тебя 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
Систематический обзор исследовал пространственно-временное распределение длинноцепочечных полиненасыщенных жирных кислот (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
Reddit
From the science community on Reddit: Spatiotemporal distribution of long-chain polyunsaturated fatty acids (LC-PUFA) in gill filterable…
Posted by koushik_roy - 7 votes and 1 comment
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
Большинство линуксоидов знают 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
Лайфхак для терминала, который реально экономит время ⚡
Вы знаете про 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
Вы знаете про 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
В 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
Задача простая: поднять 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
Новое исследование показало: люди, которые на протяжении длительного времени испытывали финансовые трудности или стабильно низкий доход в молодом и среднем возрасте, к 53 годам показывали худшие результаты в когнитивных тестах.
Иными словами, постоянная нехватка денег — это не только стресс здесь и сейчас. Это удар по мозгу в долгосрочной перспективе. Причём важна именно хроничность: не разовые финансовые трудности, а затяжные, годами тянущиеся проблемы с деньгами.
Учёные разделяют два фактора: объективно низкий доход и субъективное ощущение финансовой нестабильности. Оба оказались связаны с ухудшением когнитивных функций — памяти, скорости мышления, способности концентрироваться.
Механизм, скорее всего, в хроническом стрессе: постоянное беспокойство о деньгах держит организм в состоянии повышенной тревоги, повышает уровень кортизола, нарушает сон и в итоге буквально изнашивает мозг быстрее, чем это происходит у людей без финансового давления.
Источник (r/science): https://www.reddit.com/r/science/comments/1v72m2a/persistent_money_struggles_linked_to_faster_brain/
📍 Подпишись на создателей: https://t.me/linuxexex
Reddit
From the science community on Reddit: Persistent money struggles linked to faster brain ageing. The study found that people who…
Explore this post and more from the science community
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
Все знают про перенаправление вывода через >. Записал в файл — и дальше работаешь. Но что если нужно одновременно видеть вывод в терминале И писать его в файл? Вот тут большинство начинают городить костыли.
А можно просто использовать 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
Твой ноутбук запускает браузер, музыку, терминал и ещё пятьдесят фоновых процессов одновременно. Но ядро у тебя одно, ядер процессора — допустим, четыре. Кто решает, кому из тысячи процессов дать время на выполнение прямо сейчас? Планировщик.
Суть простая: процессор может делать только одно дело в конкретный момент времени. Задача планировщика — нарезать это время на крошечные куски и раздавать их процессам по очереди, так быстро, что тебе кажется, будто всё работает параллельно. Это называется вытесняющая многозадачность.
Как он выбирает, кому дать 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
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
Опечатался в предыдущей команде? Не обязательно переписывать всё заново.
Можно сделать так:
^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
Все знают пайпы в 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