Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Показати більше📈 Аналітичний огляд Telegram-каналу Bash Days | Linux | DevOps
Канал Bash Days | Linux | DevOps (@bashdays) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 23 758 підписників, посідаючи 5 677 місце в категорії Технології та додатки та 28 083 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 23 758 підписників.
За останніми даними від 26 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -194, а за останні 24 години на -9, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 25.52%. Протягом перших 24 годин після публікації контент зазвичай збирає 13.60% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 6 062 переглядів. Протягом першої доби публікація в середньому набирає 3 232 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 32.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як bashdays, linux, bash, docker, скрипт.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Завдяки високій частоті оновлень (останні дані отримано 27 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
( set -f; IFS=':'; for i in ${PATH:?'хуй с маслом'};do [[ -r "$i" && -d "$i/." ]] || echo "$i";done )
Эта кишка проверяет элементы в переменной PATH. И выводит на экран которые не существуют, или к которым нет доступа на чтение.
Давай разберем каждый элемент отдельно:
set -f
Отключает функцию pathname expansion (или globbing). Это предотвращает интерпретацию символов *, ? и [] как шаблонов имен файлов.
IFS=':'
Устанавливает разделитель полей (Internal Field Separator, IFS) на двоеточие «:». Это необходимо для правильного разбора переменной PATH, где пути разделены двоеточием.
for i in ${PATH:?'хуй с маслом'}
Запускает цикл for, который перебирает каждый элемент переменной PATH. Выражение ${PATH:?'empty path'} проверяет, что переменная PATH не пустая; если она пустая, выводится сообщение «хуй с маслом» и выполнение прерывается.
do [[ -r "$i" && -d "$i/." ]] || echo "$i"; done
Внутри цикла проверяется каждый элемент «i» из PATH.
[[ -r "$i" && -d "$i/." ]]
Проверяет, существует ли каталог (-d "$i/.") и доступен ли он для чтения (-r "$i").
|| echo "$i"
Если каталог не существует или недоступен для чтения, то выводится значение «i» (путь).
Думаю более менее понятно. Если видишь огромную кишку, разбивай её на части и тогда с ней проще будет разобраться.
Это как в тайм-менеджмент, что-то там блядь про делёжку слона на маленькие кусочки.В общем суть такая — если переменная PATH не установлена или пустая, команда завершится и будет выдано сообщение «хуй с маслом». Поля переменной PATH отображаются на экран, если не соответствуют минимальным требованиям, или являются нулевыми. Bash будет искать в текущей директории.
man bash → PARAMETERS → Shell Variables → PATH PATH The search path for commands. It is a colon-separated list of directories in which the shell looks for commands (see COMMAND EXECUTION below). A zero-length (null) directory name in the value of PATH indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon. The default path is system-dependent, and is set by the administrator who installs bash. A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin'✔ Минимальные требования. Каждый элемент пути должен иметь бит исполнения. Последний элемент должен быть каталогом и обладать разрешением на чтение, исполнение. Для запуска программы достаточно, чтоб исполняемый файл программы имел бит исполнения и все каталоги в пути имели бит исполнения, чтения (не требуется если указываете полный путь до исполняемого файла). У меня например после запуска кишки, выдало:
/snap/bin
Пошел смотреть и точно, в переменной PATH этот каталог указан, а физически его нет на диске.
Для исследования путей удобно использовать команду namei.
namei -m /etc
f: /etc
drwxr-xr-x /
drwxr-xr-x etc
Тему про PATH поднимал раннее в этом посте.Ну а так вроде всё, изучай! tags: #bash #linux — 🔔 @bashdays
- Converters | - JSON <> YAML | - Timestamp | - Number Base | - CRON Parser - Encoders / Decoders | - JWT | - HTML | - URL | - Base64 Text & Image | - GZip - Formatters | - JSON | - SQL | - XML - Generators | - Hash (MD5, SHA1, SHA256, SHA512) | - UUID 1 and 4 | - Lorem Ipsum | - Checksum - Text | - Inspector & Case Converter | - Regex Tester | - Text Comparer | - XML Validator | - Markdown Preview - Graphic | - Color Blindness Simulator | - Color Picker & Contrast | - PNG / JPEG Compressor | - Image Converter ... and more are coming!tags: #utilites — 🔔 @bashdays
/usr/bin/firefox
Можешь с ярлыка на рабочем столе его заранить. А если нет иксов, подставь cron или какой-нибудь свой скрипт который крутится в фоне.
Дальше открываем терминал и фапаем:
ps --no-headers -C firefox -o lstart
В ответ видим строку: Sun Jun 16 05:54:24 2024
Это и есть та самая временнáя метка, когда был запущен процесс. В моем случае firefox.
Аналогично можно узнать метку любой запущенной программы или процесса.
Формат поля lstart универсальный и его понимает тест(-newer) из предыдущего поста про find.
Давай поищем файлы в домашнем каталоге, которые были модифицированы после запуска firefox.
find ~/ -newermt "$(ps --no-headers -C firefox -o lstart)"
Выводится достаточно большой список. Это хороший кейс, когда пытаешься что-то отдебажить.
Некоторые версии утилиты ps могут создать головняк с поиском процесса по имени. Но эта ситуация легко решается с помощью других утилит для поиска PIDов.
Например, с помощью такой кишки:
find ~/ -newermt "$(ps --no-headers -p $(pgrep firefox) -o lstart)"
Думаю концепт ты понял, а дальше можешь самостоятельно пойти и разгрести какой-нибудь /proc/pid/stat или /proc/uptime.
Пользуйтесь!
⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️
А еще подписывайся на наши полезняшки и заходи попиздеть в чатик.
Поржать тут: @devopsina и @devopsgarden
tags: #linux #bash
—
🔔 @bashdays -newer. Тест (-newer) возвращает истину, если метка X новее метки Y.
Формат теста такой:
-newerXY
Y — Указывает временную метку образца. X — Указывает временную метку искомых файлов.Временные метки:
с — время изменения m — время модификации a — время последнего доступа t — буквальное время, а не имя файла (только Y) B — время создание файла (поддерживается не везде)Поддерживаемые форматы (t): Вот несколько из них, которые можно получить с помощью утилиты date.
date --rfc-3339=ns
date --rfc-2822
date +'@%s.%N'
TZ=UTC0 date +'%Y-%m-%d %H:%M:%S'
date +'%Y-%m-%d %H:%M:%S %z'
LC_ALL=C TZ=UTC0 date
Также date умеет отнимать/прибавлять даты.
date -d'- 1 hours'
Более подробно можешь почитать в гнутой доке. Или заглянуть командой: info coreutils date
Теперь давай поищем файлы в домашнем каталоге у которых время модификации, менялось с заданной даты. Минус 2 часа от текущего времени.
find ~/ -newermt "$(date --rfc-2822 -d '- 2 hours')"
Ага, получаем ожидаемый список. Ок, теперь создадим файл bashdays.txt, у которого время модификации будет -2 часа от текущего времени.
touch -mt $(date '+%Y%m%d%H%M.%S' -d '-2 hours' ) bashdays.txt
Проверяем:
stat bashdays.txt
Смотрим поле Modify, ага все верно, время -2 часа от текущего времени.
Снова запускаем поиск файлов, у которых время модификации свежее времени модификации файла bashdays.txt
find ~/ -newermm bashdays.txt
Выводим дополнительную информацию со временем модификации найденных файлов:
find ~/ -newermm bashdays.txt -printf '%t\n'
Допускается задавать разные временные метки искомых файлов и образца. Поиск файлов у которых время модификации новее времени изменения файла bashdays.txt
find ~/ -newermc bashdays.txt -printf '%t\n'
Чтобы узнать, при каких условиях изменяются временные метки. Можете поизучать man-страницы к системному вызову stat.
Где это можно применить? Ну например, для зачистки старых бэкапов, если предпочитаешь использовать для этого самописные скрипты. На самом деле дофига где применить можно, всё зависит от фантазии и потребностей.
Завтра выходной строим, в воскресение вернусь. Хороших предстоящих выходных, береги себя!
tags: #linux #bash
—
🔔 @bashdaysexport TERM=vt100
Теперь выполняем:
echo -e "\e[31mHello Bashdays\e[0m"
И видим что управляющие символы не сработали. А если экспортировать xterm-256color, то строка Hello Bashdays будет красной.
А теперь попробуй в vt100 запустить midnight commander и что-то в нем поделать. Ты будешь приятно удивлён — всё сломалось. Мышка не работает, UTF-8 не работает, F10 не работает, нихуя не работает.
Отличий на самом деле много, смысла нет все их перечислять. Используй современные решения и не лепи горбатого.
А в современном мире вообще используется vt100?
Конечно! Например, доисторические программы на каких-нибудь всратых заводах, которые заточены именно под этот вид терминала.
Либо какое-то специальное оборудование, которому не требуются свистоперделки современных терминалов, а важна лишь скорость, ясность и низкие системные требования.
В общем пусть прошлое остается в прошлом. А чтобы писька не отвалилась, выбирай — xterm-256color!
tags: #linux
—
🔔 @bashdaysКстати отлично запускается порнохабина, даже ЗВУК есть!Короче я принес, а ты уже сам смотри, мож где сгодится в хозяйстве. Увидимся! tags: #services — 🔔 @bashdays
Цеттелькастен (нем. Zettelkasten, буквальный перевод «ящики для заметок») — система ведения заметок и управления личными знаниями, используемая в исследованиях и учёбе.Звучит это правда как — Флюгегехаймен! Теперь про боли. В последни год я редко пишу код, совсем забросил свой любимый vim и успешно забыл все комбинации клавиш. Ситуация конечно интересная — тратишь кучу времени на изучение комбинаций в vim, доводишь их до инстинктов и мышечной памяти. Но спустя месяц, все эти скиллы куда-то бесследно испаряются. Походу как у бодибилдиров, накачал за год банки, на месяц сделал паузу и превратился снова в дрища. Ну пиздец же. А чтобы не просрать эти скиллы, нужно ежедневно их применять. А как их применять, если нет необходимости? Просто так дрочить вприсядку тоже не хочется, хочется чем-то полезным заниматься и не деградировать. В общем в Obsidian есть нативная поддержка vim. Я конечно знатно прихуел, но воодушевился. То есть я могу теперь писать для вас посты в комфортной для себя среде и не проёбывать скиллы по виму. Это же прекрасно! 🤙 Правда я растерял всю свою прыть и поэтому приходится заново затачивать свои зажившие пальцы под аккорды вима. Мыши кололись, плакали, но продолжали есть кактус… Ты наверное предложишь мне писать посты сразу в виме, идея хорошая, но от Obsidian я тащусь не меньше чем от вима. Все же это немного разные инструменты. Вот те ссылка на Obsidian чтоб не искать Так что, теперь я совмещаю приятное с полезным. Люблю изобретать. Может и тебя этот пост натолкнет на какие-то правильные мысли. И ты скрестишь своего бульдога с носорогом. Кстати когда я в Obsidian включил режим VIM, он мне выдал интересный попапчик, в котором до включения режима, предложил пройти небольшой квест. Прям повеселило! 👇 tags: #рабочиебудни — 🔔 @bashdays
tput используется для управления терминалом и выполнения различных задач, связанных с его настройкой и управлением. Управляющие последовательности — это специальные последовательности символов, используемые для управления поведением терминала. Они позволяют изменять цвета текста, перемещать курсор, очищать экран и выполнять другие действия, не изменяя сам текст.✔️ Практика Чтобы не усложнять, рассмотрим пример на основе clear. Эта команда очищает экран.
clear=$(tput clear)
Помещаем в переменную очистку экрана. Теперь проверяем:
printf '%s' $clear
echo -n $clear
После выполнения одной из этих команд, экран терминала будет очищен.
А почему просто не выполнить команду clear без этих вонючих tput? Потому, что это самый простой пример, чтобы ты въехал в суть.
Получается мы не плодим в своих скриптах кучу tput clear а используем оптимизированный вариант с переменной.
Чем больше параметров в tput, тем больше треша в скриптах. Проще же один раз закинуть в переменную эту кишку и не маяться хуйнёй.
Посмотреть управляющую последовательно ты можешь так:
echo ${clear@Q}
На экран выведется:
$'\E[H\E[2J\E[3J'
Конструкция: ${clear@Q} это использование параметра расширения в Bash, который отображает значение переменной clear в форме, пригодной для использования в качестве строки в программном коде. Это означает, что специальные символы будут экранированы.
Начиная с версии 4.4 в Bash, значение parameter заключаются в одинарные кавычки.
${parameter@Q}
Экранирование помогает избежать интерпретации специальных символов терминалом и позволяет безопасно выводить последовательности на экран.Пример одной строкой:
tput cup 20 60 | { read -r BASHDAYS; echo ${BASHDAYS@Q}; }
1. Генерируем управляющую последовательность для перемещения курсора терминала на 20 строку и колонку 60.
2. Передаем полученную строку по пайпу.
3. Читаем строку и присваиваем ее переменной BASHDAYS.
4. Выводим значение переменной BASHDAYS.
По итогу получаем такое:
$'\E[21;61H'
Еще вариант:
tput cup 1 10 | cat -v ; echo
Результат сам посмотришь если интересно.
Для многих это тема не новая, но я частенько наблюдаю в скриптах избыточное применение этих управляющих последовательностей.
Короче пихай это говнище в переменную и будет заебись!
На закуску держи интересный пример определения и сохранения последовательностей.
Давай краба, увидимся!
tags: #bash #linux
—
🔔 @bashdays:charset=0410-044f (охватывает все заглавные и строчные буквы русского алфавита от А до Я) ну или язык :lang=ru.
✔️ Поехали! Выводим все шрифты, которые поддерживают кодовую точку «0410».
fc-list ':charset=0410' --format '%{file}\n'
Есть нюанс. В список могут попасть шрифты, которые будут содержать кодовые точки, но у них не будет изображений символов.
Далее сопоставляем найденные шрифты, с теми которые поддерживает утилита convert.
Утилита convert является частью пакета программного обеспечения ImageMagick. Это мощный инструмент для создания, редактирования, преобразования и отображения растровых изображений.
fc-list ':charset=0410' --format '%{file}\n' | grep -wof - <(convert -list font)
Чо тут происходит. Мы отдаём через pipe результаты отработки команды fc-list на стандартный ввод grep.
w = шаблон, соответствует слову
o = выводим только совпадения, а не всю строку
f = файл строки в качестве шаблона поиска
Конструкция <(convert -list font) это подстановка процессов. Доступна в системах, поддерживающих именованные каналы (FIFO) или метод именования открытых файлов через /dev/fd.
Она имеет вид: <(список) или >(список)
Запускается процесс список и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в /dev/fd.
Имя этого файла передается в качестве аргумента текущей команде как результат подстановки.
Если использовать >(список), запись в файл будет давать входные данные процессу список.
Если используется <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.
Получается в качестве аргумента команда grep получит файл. Содержимым которого будет результат работы команды convert -list font.
Проверяем:
echo <(convert -list font)
cat <(convert -list font)
В итоге получаем нужный список шрифтов.
Font: URWGothic-Book
family: URW Gothic
style: Normal
stretch: Normal
weight: 400
glyphs: URWGothic-Book.otf
Font: URWGothic-BookOblique
family: URW Gothic
style: Oblique
stretch: Normal
weight: 400
glyphs: URWGothic-BookOblique.otf
Ну а дальше можем заряжать все это в bash скрипт и гордится, какие мы с тобой охуенные.
Для примера давай сгенерим кучу изображений с русской буквой «А» используя найденные шрифты.
#!/bin/bash
code=0410
char=$(printf '%b' '\U'$code)
fc-list ':charset='$code --format '%{file}\n' |\
grep -wof - <(convert -list font) | while read line
do
name=${line##*/}
name=${name%.*}
convert -font "$line" -pointsize 48 label:"$char" ./${name}.png
done
После запуска скрипта, в каталоге появится портянка файлов с изображениями, учти этот момент, чтобы не засрать себе п➡️ Про сигналы писал тут и тутВ Linux ты можешь найти PID процесса, а затем посмотреть:
cat /proc/$PID/status
В выхлопе будут строки описывающие какие сигналы
SigBlk - заблокированы
SigIgn - проигнорированы
SigCgt - перехвачены
Для примера беру PID=1, получаю такое:
SigBlk: 0000000000000000 SigIgn: fffffffe57f0d8fc SigCgt: 00000000280b2603Роман ты заебал! Опять какие шифры нечитабельные. Давай разберемся что это значит. Все эти числа справа, являются битовой маской. Если преобразовать это из шестнадцатеричного в двоичный, то каждый 1 бит представляет собой пойманный сигнал, считая справа налево, начиная с 1. Итак, интерпретируя строку SigCgt, видим, что мой init процесс улавливает следующие сигналы:
00000000280b2603 ==> 101000000010110010011000000011
На телефонах вся эта поебота выглядит очень стрёмно, поэтому смотрим картинку к этому посту 👆Как сопоставить числовые сигналы с именем? Я выполнил команду:
kill -l
И получил список всех сигналов от 1-31, а дальше уже дело техники.
И помним, что мы не можем заблокировать сигнал, если программа не готова к его перехвату. Если сигнал не был пойман, происходит действие по умолчанию, обычно это — завершение процесса.
Нахера всё это нужно? Ну если ты рядовой потребитель, то конечно оно тебе и не нужно. А если ты «автомеханик», то извините, хош не хош, а как оно внутри работает знать обязан.
Вот те скрипт, который покажет какие сигналы прослушивает программа. Да, скрипт преобразует криптошифры в нормальные имена сигналов. Избавляю вас от еботни, как говорится все для вас мои дорогие подписчики 🙃
#!/bin/bash
set -e
grep -m3 -P '^Sig(?:Blk|Ign|Cgt):' "/proc/$1/status" | while read field value
do
bits=$(printf 'ibase=16; obase=2; %X\n' '0x'$value | bc)
sigs=()
i=0
while [[ $bits ]]
do
((++i))
[[ ${bits:$((${#bits} - 1))} -eq 1 ]] && sigs+=($i)
bits=${bits::-1}
done
(( ${#sigs[*]} )) && sigs=( $(kill -l ${sigs[*]}) )
echo $field ${sigs[*]}
done
exit
При запуске нужно указать PID процесса: script.sh <pid>
Вроде всё. Если есть чо добавить, велком в комменты. Ну и всех с пятницей, хороших предстоящих выходных, берегите себя!
Пользуйтесь!
tags: #bash #linux #debug
—
🔔 @bashdays
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
