Милых дам, от всего сердца, поздравляю с наступающим праздником Международным женским днем. Желаю Любви, Счастья и Здоровья.
🔤 🔤 🔥 🔤 🔤 🔤 🔤
Открытка к празднику: https://github.com/tagd-tagd/heart
PS: Редакция @bashdays (Рома, Дима, Бухи, Маркетологи и остальные) присоединяемся к поздравлениям!
8е марта это как третий новый год (второй — старый новый год), но в разыкруче важнее для девушек.
Банальностей желать не будем, самое главное тебе — ЛЮБВИ и БАБОК, ну и если можно — не выноси своему мужику мозг и всё у тебя будет хорошо и отлично! Лови виртуальные тюльпаны:
🌷🌷🌷
Меня так с 23м никто не поздравлял🥳
🅰️ 🅰️
Открытка к празднику: https://github.com/tagd-tagd/heart
PS: Редакция @bashdays (Рома, Дима, Бухи, Маркетологи и остальные) присоединяемся к поздравлениям!
8е марта это как третий новый год (второй — старый новый год), но в разы
Банальностей желать не будем, самое главное тебе — ЛЮБВИ и БАБОК, ну и если можно — не выноси своему мужику мозг и всё у тебя будет хорошо и отлично! Лови виртуальные тюльпаны:
🌷🌷🌷
Меня так с 23м никто не поздравлял
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - tagd-tagd/heart
Contribute to tagd-tagd/heart development by creating an account on GitHub.
Еще один распространенный вопрос — а чё ты на proxmox крутишь?
ㅤ
Начнем с того, что я недавно взял Findarling N150 (16Gb) в Озоне. Эт такой мини компьютер, 15 на 15 сантиметров.
Сейчас у меня на нем пашут 11 lxc контейнеров. Сенсоры показывают 47 градусов, по нагрузке RAM 17%, ну и проц там несильно тротлит. Короче ничего ресурсоёмкого.
Чё я на нём кручу:
Qbittorrent - та самая качалка-кончалка, в основном киношки и сериалы на ночь, а больше от нее ничего и не нужно.
Jellyfin - морда для просмотра киношек, подключил нативный DLNA и вообще сказка, смотрим мультики по всей квартире да и для родственников удаленный доступ расшарил (заебался правда с микротиком, не моё железо). Сами добавляют в кончалку свои сериалы и потом спокойно наслаждаются прокрастинацией.
Sonarr - сервис для автоматической загрузки сериалов, дада, сам отслеживает выход новых серий и скармливает их в Qbittorrent. Прям конфета!
Radarr - сервис для автоматической загрузки фильмов, аналогично Sonarr, само там всё шуршит и наполняем медиатеку.
Jacket - индексер/интегратор торрентов для Sonarr и Radarr, хуй знает зачем, прикручивал по мануалам, видимо нужная штука.
И да, чтобы заработал Sonarr и Radarr пришлось пустить lxc контейнеры через определенные трехбуквенные сервисы (сделал через wireguard). Но можно и через проксю, там есть для этого все необходимые настройки.
Чтобы настроить всю эту связку нужно просто погуглить, мануалов дохуя.
Syncthing - сервис синхронизации файлов, делаю бекапы с виндовых машин (документы, фотки и т.п.) на те самые USB жесткие диски которые подключены к коробочке с Озона.
Pi-Hole - рекламорезка, поставил, потыкал, хуй с ним, пусть болтается. В основном использую как локальный DNS сервер. Сделал домены вида:
Nginx manager - точка входа на все сервисы, забил локальные домены из Pi-Hole, а дальше все само проксируется куда нужно. Ушел от айпишников, как-то поудобнее стало.
Samba - подключены шары с USB винтов, раздаю на винду, хуй знает зачем, видимо остатки легаси с малины переехали.
Runners - это просто lxc контейнер с раннерами, гитлаб, гитеа и т.п. Ничего лишнего, само что-то там делает и в ус не дует.
Dev - контейнер для разработки, пишу в нем скрипты, гоняюлысого ансибл. Подключаюсь к нему через VSCode как RemoteSSH.
Вот и всё, никаких плексов, nextcloud и т.п. хуйни не ставил, избыточно.
Аа, еще кластер кубера поднял для написания уроков для Linux Factory. Но кластер включаю только по необходимости, большую часть времени оно выключено.
Планирую еще поднять Proxmox Backup Manager, чтобы lxc контейнеры не проебались, хотя там особо ничего такого и нет если всё пиздой навернется. Но потыкать надо, визуально хоть посмотреть с чем это гавно едят.
Вообще я не фанат proxmox, был печальный опыт в проде. Перезагрузили сервак с proxmox, а он в кернел паник ушел и хуй знает чо с ним делать. А там 2 больших интернет магазина было у ребят развернуто, разом всё наебнулось. Ну и недавно на малине у меня такой-же факап произошел, даж разбираться не стал, оно того не стоит.
Отлично подходит поговорка — про яйца и корзину
Такие дела… А что у тебя на proxmox крутится? Пиши уже в комменты!
tags: #рабочиебудни #proxmox
—
🔔 @bashdays➡️ @gitgate
ㅤ
Начнем с того, что я недавно взял Findarling N150 (16Gb) в Озоне. Эт такой мини компьютер, 15 на 15 сантиметров.
Сейчас у меня на нем пашут 11 lxc контейнеров. Сенсоры показывают 47 градусов, по нагрузке RAM 17%, ну и проц там несильно тротлит. Короче ничего ресурсоёмкого.
В общем пепякой доволен, подкинул на него еще 4 терабайта винтов по USB и вообще сказка.
Чё я на нём кручу:
Qbittorrent - та самая качалка-кончалка, в основном киношки и сериалы на ночь, а больше от нее ничего и не нужно.
Jellyfin - морда для просмотра киношек, подключил нативный DLNA и вообще сказка, смотрим мультики по всей квартире да и для родственников удаленный доступ расшарил (заебался правда с микротиком, не моё железо). Сами добавляют в кончалку свои сериалы и потом спокойно наслаждаются прокрастинацией.
Sonarr - сервис для автоматической загрузки сериалов, дада, сам отслеживает выход новых серий и скармливает их в Qbittorrent. Прям конфета!
Radarr - сервис для автоматической загрузки фильмов, аналогично Sonarr, само там всё шуршит и наполняем медиатеку.
Jacket - индексер/интегратор торрентов для Sonarr и Radarr, хуй знает зачем, прикручивал по мануалам, видимо нужная штука.
Существует еще Lidarr для музыки, но мне подписки яндекса хватает с головой. Ну и еще куча всяких типа Animarr'ов, Hahuyar'ов.
И да, чтобы заработал Sonarr и Radarr пришлось пустить lxc контейнеры через определенные трехбуквенные сервисы (сделал через wireguard). Но можно и через проксю, там есть для этого все необходимые настройки.
Чтобы настроить всю эту связку нужно просто погуглить, мануалов дохуя.
Syncthing - сервис синхронизации файлов, делаю бекапы с виндовых машин (документы, фотки и т.п.) на те самые USB жесткие диски которые подключены к коробочке с Озона.
Но чет при синке 400 гигов оно раком встает (на винде ребутится падла), буду позже с этим разбираться. Ебучий оупенсорц!
Pi-Hole - рекламорезка, поставил, потыкал, хуй с ним, пусть болтается. В основном использую как локальный DNS сервер. Сделал домены вида:
torrents.local, sonnar.local и т.п.Nginx manager - точка входа на все сервисы, забил локальные домены из Pi-Hole, а дальше все само проксируется куда нужно. Ушел от айпишников, как-то поудобнее стало.
Samba - подключены шары с USB винтов, раздаю на винду, хуй знает зачем, видимо остатки легаси с малины переехали.
Runners - это просто lxc контейнер с раннерами, гитлаб, гитеа и т.п. Ничего лишнего, само что-то там делает и в ус не дует.
Dev - контейнер для разработки, пишу в нем скрипты, гоняю
Вот и всё, никаких плексов, nextcloud и т.п. хуйни не ставил, избыточно.
Аа, еще кластер кубера поднял для написания уроков для Linux Factory. Но кластер включаю только по необходимости, большую часть времени оно выключено.
Планирую еще поднять Proxmox Backup Manager, чтобы lxc контейнеры не проебались, хотя там особо ничего такого и нет если всё пиздой навернется. Но потыкать надо, визуально хоть посмотреть с чем это гавно едят.
Вообще я не фанат proxmox, был печальный опыт в проде. Перезагрузили сервак с proxmox, а он в кернел паник ушел и хуй знает чо с ним делать. А там 2 больших интернет магазина было у ребят развернуто, разом всё наебнулось. Ну и недавно на малине у меня такой-же факап произошел, даж разбираться не стал, оно того не стоит.
Отлично подходит поговорка — про яйца и корзину
Большая часть контейнеров поднята одной командой с сайта Helper Scripts
Такие дела… А что у тебя на proxmox крутится? Пиши уже в комменты!
tags: #рабочиебудни #proxmox
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Тренажёр для технических собеседований!
ㅤ
Довольно часто сталкиваюсь с вопросом от ребят — вот бы с кем-нибудь пройти интервью/собес...
Раньше бы я ответил так — ну дак пройди, накидай откликов, согласуй интервью да и сходи. Делов то.
Но сейчас скажу так — пройди интервью с GPT!
Мы живем в современном мире, надо использовать такие возможности. Код конечно лучше писать самому, но замутить технический собес вполне допустимо. Тем более это все можно сделать бесплатно, без камер и без вспотевших подмышек.
Тут даждикпик deepseek с этим заебись справляется, вот прям лично потыкал. Тут еще плюс, что ты можешь запросить ответ который от тебя ожидали. Либо попросить машину, чтобы она дала оценку твоему корявому ответу.
Как это работает
Короче, пиздуешь на ХеХеру, находишь вкусную вакансию, копируешь требования и скармливаешь это нейронке.
Предварительно пишешь вводные типа:
Ну и копипастишь требования с ХеХеру.
Всё блядь! В ответ получаешь вопросы, отвечаешь на них, получаешь оценку, при необходимости запрашиваешь правильные ответы и ссылки на литературу и источники.
Примеры вопросов из вакансии на девопс-джуна:
- Какие типы плейбуков вы создавали?
- В чем разница между
- Какие лучшие практики по оптимизации Docker-образов?
- Чем отличается контейнер от виртуальной машины?
- Что такое GitLab Runner и как он работает?
Можешь сразу в нескольких нейронках это замутить либо запросить дополнительные вопросы. + Можешь запросить тестовые задания и спокойно их порешать.
Ну и самое главное в конце не забудь запросить у него — рекомендации, по тому как сделать это лучше.
После таких тренировок, можно кидать отклик и получать 100500 офферов в секунду. Но при условии если ты реально проникся.
В общем еби эти нейронки в хвост и гриву, хоть что-то полезное они для тебя сделают.
С пятницей, береги себя, ну и хороших тебе предстоящих выходных!
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Довольно часто сталкиваюсь с вопросом от ребят — вот бы с кем-нибудь пройти интервью/собес...
Раньше бы я ответил так — ну дак пройди, накидай откликов, согласуй интервью да и сходи. Делов то.
Но сейчас скажу так — пройди интервью с GPT!
Мы живем в современном мире, надо использовать такие возможности. Код конечно лучше писать самому, но замутить технический собес вполне допустимо. Тем более это все можно сделать бесплатно, без камер и без вспотевших подмышек.
Тут даж
Как это работает
Короче, пиздуешь на ХеХеру, находишь вкусную вакансию, копируешь требования и скармливаешь это нейронке.
Предварительно пишешь вводные типа:
Привет, меня зовут Олег, мне 22 года, представь что ты технический директор, я пришел к тебе на собеседование на вакансию «переворачиватель пингвинов», проведи мне техническое собеседование по этим требованиям. Ты будешь задавать мне вопросы, а я буду на них отвечать.
Ну и копипастишь требования с ХеХеру.
Всё блядь! В ответ получаешь вопросы, отвечаешь на них, получаешь оценку, при необходимости запрашиваешь правильные ответы и ссылки на литературу и источники.
Примеры вопросов из вакансии на девопс-джуна:
- Какие типы плейбуков вы создавали?
- В чем разница между
git rebase и git merge- Какие лучшие практики по оптимизации Docker-образов?
- Чем отличается контейнер от виртуальной машины?
- Что такое GitLab Runner и как он работает?
Можешь сразу в нескольких нейронках это замутить либо запросить дополнительные вопросы. + Можешь запросить тестовые задания и спокойно их порешать.
Ну и самое главное в конце не забудь запросить у него — рекомендации, по тому как сделать это лучше.
После таких тренировок, можно кидать отклик и получать 100500 офферов в секунду. Но при условии если ты реально проникся.
В общем еби эти нейронки в хвост и гриву, хоть что-то полезное они для тебя сделают.
С пятницей, береги себя, ну и хороших тебе предстоящих выходных!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Краткий экскурс для чего нужен влан (vlan).
🔤 🔤 🔥🔤 🔤 🔤 🔤 🔤
ㅤ
Недавно у меня возник вопрос как проектировать сеть. Почему делается разбиение сети именно так, а не иначе. Какие цели преследуются при разбиении сетей.
Статья исключительно моё мнение, которое может не совпадать с мнением профессиональных сетевиков, и может быть не совсем верна.
Сеть строится на основе vlan.
Задача: Создать сеть для дома.
Необходимые требования:
- Коммутатор 2 уровня сети
- Компьютеры с умением работы с vlan
Все ОС windows, кроме серверного исполнения не умеют работать с Trunk.
Сначала определяем какие сети не нужны для пересечения:
1) DMZ (внешняя сеть на сервере) (vlan 5) (
2) LAN (Внутренняя сеть на сервере) (vlan 100) (
3) Mgmt (сеть управления + сеть передачи служебной информации для серверов) (vlan 200) (
4) Сеть внутренняя недоверенная (wifi, printer, умные колонки, современные TV и другие недоверенные устройства) (vlan 300)(
5) Телефония (если есть) (
На каждую сеть создается свой пул ip-адресов.
Теперь можно приступать написанию схемы сети.
Примерную схему сети смотри на Картинке 1 👆
➡️ Теперь остановимся поподробнее на проектировании сети на гипервизорах:
Смотрим Картинку 2 👆
При настройке делаем бриджи на всех сетевых картах.
Но только на 1 интерфейсе создаем ip адрес (тот интерфейс, который будет находиться в vlan 200 (mgmt vlan).
Соответственно при создании виртуальных машин на самих серверах создаем интерфейсы и на этих вм добавляем ip.
При работе между серверами для работы используется mgmt интерфейсы.
Доступ к серверам будет осуществляться только с компьютера jump-client.
Все остальные сервера будут размещаться в соответствующих сетях.
В результате создается меньше коллизий на сети и сеть становится более защищенной.
Я бы эту статью бы не написал, если бы были нормальные статьи про разделения сетей и для чего это надо.
tags: #networks
—
🔔 @bashdays➡️ @gitgate
ㅤ
Недавно у меня возник вопрос как проектировать сеть. Почему делается разбиение сети именно так, а не иначе. Какие цели преследуются при разбиении сетей.
Статья исключительно моё мнение, которое может не совпадать с мнением профессиональных сетевиков, и может быть не совсем верна.
Сеть строится на основе vlan.
Задача: Создать сеть для дома.
Необходимые требования:
- Коммутатор 2 уровня сети
- Компьютеры с умением работы с vlan
Все ОС windows, кроме серверного исполнения не умеют работать с Trunk.
Сначала определяем какие сети не нужны для пересечения:
1) DMZ (внешняя сеть на сервере) (vlan 5) (
192.168.1.0/24)2) LAN (Внутренняя сеть на сервере) (vlan 100) (
172.16.1.0/26)3) Mgmt (сеть управления + сеть передачи служебной информации для серверов) (vlan 200) (
172.16.1.64/26)4) Сеть внутренняя недоверенная (wifi, printer, умные колонки, современные TV и другие недоверенные устройства) (vlan 300)(
172.16.2.0/25)5) Телефония (если есть) (
172.16.2.128/25)На каждую сеть создается свой пул ip-адресов.
Теперь можно приступать написанию схемы сети.
Примерную схему сети смотри на Картинке 1 👆
Смотрим Картинку 2 👆
При настройке делаем бриджи на всех сетевых картах.
Но только на 1 интерфейсе создаем ip адрес (тот интерфейс, который будет находиться в vlan 200 (mgmt vlan).
Соответственно при создании виртуальных машин на самих серверах создаем интерфейсы и на этих вм добавляем ip.
При работе между серверами для работы используется mgmt интерфейсы.
Доступ к серверам будет осуществляться только с компьютера jump-client.
Все остальные сервера будут размещаться в соответствующих сетях.
В результате создается меньше коллизий на сети и сеть становится более защищенной.
Я бы эту статью бы не написал, если бы были нормальные статьи про разделения сетей и для чего это надо.
tags: #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
И на старуху бывает проруха...
ㅤ
🔤 🔤 🔥 🔤 🔤 🔤 🔤
Сегодня решил поделиться отрицательным опытом. Код, приведенный в статье лучше не использовать.
У меня возникла необходимость распарсить файл типа:
Видно, что однословные поля разделены пробелом, а многословные заключены в кавычки. Распарсить такой файл на awk можно, но не быстро. Нужно писать код.
А на bash - вроде просто:
Проверил — вроде работает. Классно, пишу цикл, проверяю на файле — не работает. Упрощаю код до минимума.
Очевидно, разбились по пробелам. Перепробовал кавычки — не выходит. Не придумал ничего лучшего, как использовать конструкцию:
Все работает как надо.
После этого я решил распарсить реальный лог apache.
Все работало прекрасно, но на определенной строчке все зависало на несколько секунд, а потом продолжалось. Начал разбираться, и когда понял, что происходит — чуть не поседел.
Там была инъекция:
Переменная
Ничего страшного. Просто пинг 6 раз на адрес. И этот пинг ИСПОЛНЯЕТСЯ, вызывая задержку. Но команда могла быть и другой. Спасибо дядям за доброту.
Проблема возникла из-за того, что оператор
В общем, если я раньше считал оператор
Вот такой опыт.
tags: #bash #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Сегодня решил поделиться отрицательным опытом. Код, приведенный в статье лучше не использовать.
У меня возникла необходимость распарсить файл типа:
xxx yy "zz zz zz zz"
Видно, что однословные поля разделены пробелом, а многословные заключены в кавычки. Распарсить такой файл на awk можно, но не быстро. Нужно писать код.
А на bash - вроде просто:
set -- xxx yy "zz zz zz zz"
echo $# $1 $2 $3
# 3 xxx yy zz zz zz zz
Проверил — вроде работает. Классно, пишу цикл, проверяю на файле — не работает. Упрощаю код до минимума.
REC='xxx yy "zz zz zz zz"'
set -- $REC
echo $# $1 $2 $3
# 6 xxx yy "zz
Очевидно, разбились по пробелам. Перепробовал кавычки — не выходит. Не придумал ничего лучшего, как использовать конструкцию:
REC='xxx yy "zz zz zz zz"'
eval "set -- $REC"
echo $# $1 $2 $3
# 3 xxx yy zz zz zz zz
Все работает как надо.
После этого я решил распарсить реальный лог apache.
Все работало прекрасно, но на определенной строчке все зависало на несколько секунд, а потом продолжалось. Начал разбираться, и когда понял, что происходит — чуть не поседел.
Там была инъекция:
$(ping${IFS}-c${IFS}6${IFS}aa.bb.cc.dd)Переменная
IFS использовалась вместо пробела. Короче, команда выглядела так:ping -c 6 aa.bb.cc.dd
Ничего страшного. Просто пинг 6 раз на адрес. И этот пинг ИСПОЛНЯЕТСЯ, вызывая задержку. Но команда могла быть и другой. Спасибо дядям за доброту.
Проблема возникла из-за того, что оператор
eval разворачивал не только мою переменную, а все переменные, в том числе и из лога, попутно выполняя команды.В общем, если я раньше считал оператор
eval — бесполезным, то теперь я считаю его вредным.Вот такой опыт.
tags: #bash #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 63
Вот всё трём мы с тобой за бест-практики, но практически ничего не разбираем по бэд-практикам.
ㅤ
Давай это исправлять в контексте Bash скриптов.
Временами будет много, временами мало и банально, но постараюсь всё разжевать и сделать интересную выжимку из наблюдений.
Ну чё, готов? Тогда поехали!
Почему при копировании файлов, необходимо использовать кавычки?
Допустим, у тебя есть переменная
Если мы пишем:
То возникает проблема, Если имя файла содержит пробелы, то Bash ясен хуй разобьет эту строку на пробелы:
Команда превращается в такое:
И это воспримется интерпретатором как копирование нескольких файлов:
Дальше. Если в имени файла (
Ага. Теперь если в имени файла содержится символ
Как правильно?
Вот так:
Кавычки в данном контексте предотвратят разделение на пробелы и ошибочное расширение подстановок.
Но если сделать так:
Чтобы не быть «инвалидом и бараном» нужно после
Эти два тире напомнят
Каков итог?
Думаю ты и сам выводы сделал. Всегда пиздярь кавычки вокруг переменных в Bash.
Даже если работает без кавычек это ничего не значит, не ровен час получишь по ебалу.
В общем сразу мотай на ус эту тему, подстели соломку и пиши скрипты как профи.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
ㅤ
Давай это исправлять в контексте Bash скриптов.
Временами будет много, временами мало и банально, но постараюсь всё разжевать и сделать интересную выжимку из наблюдений.
Естественно будет серебряная пуля — как сделать правильно.
Ну чё, готов? Тогда поехали!
Почему при копировании файлов, необходимо использовать кавычки?
Допустим, у тебя есть переменная
$file, в которой как ни странно хранится имя файла. И есть $target, в ней мы указываем путь куда скопировать файл. Если мы пишем:
cp $file $target
То возникает проблема, Если имя файла содержит пробелы, то Bash ясен хуй разобьет эту строку на пробелы:
file="You can suck my dick.avi"
Команда превращается в такое:
cp You can suck my dick.avi /tmp
И это воспримется интерпретатором как копирование нескольких файлов:
You
can
suck
my
dick.avi
Дальше. Если в имени файла (
$file) будут символы *, ?, [ ], то это интерпретируется как шаблон для поиска файла.Так называемое — Pathname Expansion.
Ага. Теперь если в имени файла содержится символ
-, к примеру твой файл называется: -bashdays.txt, то команда cp расценит, что ты указал флаг и выебет тебя в глаз.cp -bashdays.txt /tmp
cp: ну ты ебать инвалид -- 'h'
Try 'cp --help' for more information.
Как правильно?
Вот так:
cp -- "$file" "$target"
Кавычки в данном контексте предотвратят разделение на пробелы и ошибочное расширение подстановок.
Но если сделать так:
cp "-bashdays.txt" "/tmp"
cp: еще и баран -- 'h'
Try 'cp --help' for more information.
Чтобы не быть «инвалидом и бараном» нужно после
cp вхерачить --.Эти два тире напомнят
cp что дальше идут только файлы, а никакие-то флаги.Каков итог?
Думаю ты и сам выводы сделал. Всегда пиздярь кавычки вокруг переменных в Bash.
Даже если работает без кавычек это ничего не значит, не ровен час получишь по ебалу.
Например твой скрипт будет выполняться в другом окружении, где $IFS (разделитель слов) изменён или файлы содержат пробелы и спецсимволы.
В общем сразу мотай на ус эту тему, подстели соломку и пиши скрипты как профи.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем погружаться в Бэд-Практики!
ㅤ
В прошлом посте мы рассмотрели файлы, которые начинаются с дефиса и то, что команда
Как это победить мы с тобой уже знаем, завернуть в кавычки и кинуть два дефиса:
Ок. Минус этого метода — его нужно сука запомнить и не забывать использовать каждый раз при передачах файлов. Вообще не интуитивно.
Второй способ разруливания этой ситуации — указать путь к файлу.
Смотри. Если перед именем файла добавить
В этом случае
Ну и еще вариант на закуску.
Можно просто ебануть
Этот варик немного сэкономит ресурсы, тут не требуется дополнительных вычислений для обработки имен файлов. Но при условии, что у тебя немного файлов. Если их будет дохуя, то увы, будет тормозить.
Выводы
Лучший вариант — всегда указывать путь к файлу (относительный
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
ㅤ
предыдущие посты о том, что это такое ищи по тегу #badpractices
В прошлом посте мы рассмотрели файлы, которые начинаются с дефиса и то, что команда
cp их может воспринимать как флаг. Ну дак вот.Как это победить мы с тобой уже знаем, завернуть в кавычки и кинуть два дефиса:
cp -- "$file" "$target"
Что означают 2 дефиса опять же смотри предыдущие посты по тэгу #badpractices
Ок. Минус этого метода — его нужно сука запомнить и не забывать использовать каждый раз при передачах файлов. Вообще не интуитивно.
Второй способ разруливания этой ситуации — указать путь к файлу.
Смотри. Если перед именем файла добавить
./ (означает текущую папку), то даже если файл называется -bashdays.txt он будет передан в команду правильно.for i in ./*.txt; do
cp "$i" /tmp
done
В этом случае
cp не затроит и выполнит задуманное.Ну и еще вариант на закуску.
Можно просто ебануть
./ перед именем файла при передачах в команду:for i in *.txt; do
cp "./$i" /tmp
done
Этот варик немного сэкономит ресурсы, тут не требуется дополнительных вычислений для обработки имен файлов. Но при условии, что у тебя немного файлов. Если их будет дохуя, то увы, будет тормозить.
Выводы
Лучший вариант — всегда указывать путь к файлу (относительный
./ или полный /home/user/...). Это избавит тебя от большинства проблем с файлами которые начинаются с дефиса.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет друзья, наш товарищ
ㅤ
Сюда она естественно не влезла, да и с форматированием тут беда, поэтому пришлось поднять сопроводительный блог для таких целей.
Так что запасаемся кофеём/пивком и камон 👇
➡️ Всё что нужно знать про CrowdSec
tags: #security
—
🔔 @bashdays➡️ @gitgate
Sf1nk5 подготовил внушительную статью про CrowdSec. За что ему объявлена благодарность.CrowdSec — это система защиты от кибератак, которая использует анализ поведения и коллективную защиту. Она похожа на Fail2Ban, но более мощная и современная.
ㅤ
Сюда она естественно не влезла, да и с форматированием тут беда, поэтому пришлось поднять сопроводительный блог для таких целей.
Так что запасаемся кофеём/пивком и камон 👇
tags: #security
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Вчера после статьи про CrowdSec много ребят обратились с вопросом — мужик, а чё за движок такой у твоего блога?
Отвечу сразу всем. Это не движок, это статика. И сделана она при помощи фреймворка MKDocs + Material.
ㅤ
Суть там простая, верстаешь статейки в
Скорость работы по сравнению с
Порог вхождения прям минимальный.
А самое главное — отлично написанная документация. Можно чёрта закостомить, реврайтить базовые вещи, js писать, полностью менять верстку. Но обычно коробочных приколюх уже достаточно.
Плюс к этому полно роликов на ютубе, как эту чачу заводить и размещать на серверах.
Базовый файл
В моём случае я просто подключил нативный плагин блога в
Больше боли мне доставило написать пайплайн для
Настоятельно рекомендую потыкать этот
И да, это отличный способ развернуть свою личную wiki и не ебстись со всякими конфлюенсами и т.п. Ну либо документацию к проектам к своим описывать тоже маст-хевная штукенция.
Кстати в GitGate оно как-то от Димы уже прилетало, но там про material не упоминалось.
Ладно, не смею тебя больше отвлекать, вечерком еще увидимся.
tags: #рабочиебудни #frameworks
—
🔔 @bashdays➡️ @gitgate
Отвечу сразу всем. Это не движок, это статика. И сделана она при помощи фреймворка MKDocs + Material.
ㅤ
Суть там простая, верстаешь статейки в
markdown, пушишь в гит репу, оно собирается в статику и автоматом выкатывается в прод.Скорость работы по сравнению с
wordpress просто ебейшая (статика хули). Сейчас занимаюсь SEO оптимизацией, роботсы, сайтмепы и т.п.Порог вхождения прям минимальный.
А самое главное — отлично написанная документация. Можно чёрта закостомить, реврайтить базовые вещи, js писать, полностью менять верстку. Но обычно коробочных приколюх уже достаточно.
Плюс к этому полно роликов на ютубе, как эту чачу заводить и размещать на серверах.
Базовый файл
requirements.txt выглядит так:mkdocs
mkdocs-material
mkdocs-material-extensions
В моём случае я просто подключил нативный плагин блога в
mkdocs.yml и немного его сконфигурял.plugins:
- search
- tags
- blog:
blog_dir: .
blog_toc: false
archive_name: Архив
archive_toc: false
archive_date_format: yyyy
archive_url_date_format: yyyy
authors_file: "{blog}/.authors.yml"
post_url_format: "{slug}"
post_date_format: short
pagination: true
pagination_per_page: 5
draft: true
draft_on_serve: true
post_readtime_words_per_minute: 300
Больше боли мне доставило написать пайплайн для
gitea, но я поборол этого босса и вечерком скину наработки. Глядишь под гитхаб адаптируешь, там синтаксис почти один в один.Gitea использую для личных проектов, без всяких наворотов, встроенного CI/CD и раннера вполне хватает.
Настоятельно рекомендую потыкать этот
Mkdocs с полезной нагрузкой Material, я прям в восторге прибываю.И да, это отличный способ развернуть свою личную wiki и не ебстись со всякими конфлюенсами и т.п. Ну либо документацию к проектам к своим описывать тоже маст-хевная штукенция.
Кстати в GitGate оно как-то от Димы уже прилетало, но там про material не упоминалось.
Ладно, не смею тебя больше отвлекать, вечерком еще увидимся.
tags: #рабочиебудни #frameworks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Такс, как и обещал притаранил тебе рабочий пайплайн для авто деплоя
ㅤ
Чтобы всё это заработало, в проекте тебе нужно создать структуру:
Файл можешь обозвать как угодно.
Давай пробежимся:
Триггер
Следом запускается джоба
Дальше используем адаптированный контейнер с убунтой 22.04 специально адаптированный под тестирование GitHub Actions через
Почему GitHub Actions? Потому что
Пиздеть не буду, не переносил, но если у тебя есть опыт, то было бы интересно увидеть его в комментариях.
Потом идут шаги
После сборки идет секция с деплоем, я использую этот экшен. Основан он на
Забиваем нужные ключи и переменные, которые требуются для работы этого экшена. Переменные определяешь в настройках проекта в
SSH_PRIVATE_KEY = Приватный ssh ключ с которым раннер пойдет на твой сервер и подключиться по ssh к нему. Соответственно публичная часть ключа должна быть прописана у пользователя на сервере в файле
ARGS = Аргументы для
SOURCE = Какой каталог со статикой отправляем. В
REMOTE_HOST & REMOTE_USER = Айпишник или домен продакшена на который деплоим + имя пользователя под которым подключаемся к серверу.
TARGET = В какую папку на проде скинуть содержимое папки
Параметров в экшене гораздо больше, у меня приведен необходимый минимум. Про все ключи и свистоперделки этого экшена можешь почитать тут.
Вот и всё. Теперь при пуше в
В моем случае выкатываются новые посты в
Короче хорошего тебе вечера, теперь уже до завтра!
tags: #devops #cicd
—
🔔 @bashdays➡️ @gitgate
mkdocs через gitea.ㅤ
Чтобы всё это заработало, в проекте тебе нужно создать структуру:
.gitea/workflows/deploy.yml
Файл можешь обозвать как угодно.
name: Build and Deploy Bashdays Blog
on:
push:
branches:
- main
jobs:
build:
runs-on: super-runner
container:
image: catthehacker/ubuntu:act-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies and build
run: |
pip install -r requirements.txt
mkdocs build
- name: Deploy to Server
uses: https://gitea.com/aquelle1/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-rlgoDzvc -i --delete"
SOURCE: "site/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
Давай пробежимся:
Триггер
on: push: запускается если что-то запушено в ветку main. Почему в main а не в master? Читай тут.
Следом запускается джоба
build на раннере super-runner, не забываем зарегать себе раннер, без него нихуя не получится.Что такое раннеры и как с ними работать, можешь загуглить, там по сути ничего сложного. Поэтому этот этап пропущу. Чуть позже отдельным постом запилю про это.
Дальше используем адаптированный контейнер с убунтой 22.04 специально адаптированный под тестирование GitHub Actions через
act.Почему GitHub Actions? Потому что
gitea унаследовало синтаксис и пайплайны в теории могут переносится между системами.Пиздеть не буду, не переносил, но если у тебя есть опыт, то было бы интересно увидеть его в комментариях.
Потом идут шаги
speps, клонируется репозиторий с проектом в контейнер, устанавливаются необходимые зависимости через «пипку», ну и билдится финальная статика.После сборки идет секция с деплоем, я использую этот экшен. Основан он на
rsync поверх ssh.Забиваем нужные ключи и переменные, которые требуются для работы этого экшена. Переменные определяешь в настройках проекта в
gitea в секции secrets.SSH_PRIVATE_KEY = Приватный ssh ключ с которым раннер пойдет на твой сервер и подключиться по ssh к нему. Соответственно публичная часть ключа должна быть прописана у пользователя на сервере в файле
~/.ssh/authorized_keys.Как работать с ssh ключами, читай по тегу #linuxfactory
ARGS = Аргументы для
rsync, рекурсивное копирование, сохранение прав доступа, удаление файлов которые не в локальной версии.SOURCE = Какой каталог со статикой отправляем. В
Mkdocs статика генерится по умолчанию в папку site.REMOTE_HOST & REMOTE_USER = Айпишник или домен продакшена на который деплоим + имя пользователя под которым подключаемся к серверу.
TARGET = В какую папку на проде скинуть содержимое папки
site.Параметров в экшене гораздо больше, у меня приведен необходимый минимум. Про все ключи и свистоперделки этого экшена можешь почитать тут.
Вот и всё. Теперь при пуше в
main ветку, автоматически запустится пайплайн и на прод выкатятся изменения.В моем случае выкатываются новые посты в
markdown. Этот процесс хочу автоматизировать и продублировать все посты из этого канала в блог, сделать наконец нормальную навигацию и поиск. А то чёрт ногу сломит уже, хуй чё найдешь. Но это пока только мечты, мечты...Короче хорошего тебе вечера, теперь уже до завтра!
tags: #devops #cicd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотел тебя порадовать годнотой, но чёт батарейка села за неделю, как обычно, повылазила рутина, там прод пизданулся, здесь кластер развалился, и т.п. Планируешь задачу одну, а получаешь хуем по лбу.
Такова жизнь в айти, никогда не знаешь что тебя ожидает через минуту. Ну да ладно, со всем справимся, мыж с вами позитивные типы.
Самое главное, что сегодня пятница и завтра можно лишний часик подрыхнуть. Ну а если ты ночной страж, то сил тебе и терпения. Всё наладится!
В общем с пятницей ребят, берегите себя и выкраивайте лишний часик, чтобы отдохнуть, всех денег не заработаешь, а горящие продакшены могут и подождать.
Завтра снова рутина, как только так сразу вернусь к тебе! Всех обнял!
Такова жизнь в айти, никогда не знаешь что тебя ожидает через минуту. Ну да ладно, со всем справимся, мыж с вами позитивные типы.
Самое главное, что сегодня пятница и завтра можно лишний часик подрыхнуть. Ну а если ты ночной страж, то сил тебе и терпения. Всё наладится!
В общем с пятницей ребят, берегите себя и выкраивайте лишний часик, чтобы отдохнуть, всех денег не заработаешь, а горящие продакшены могут и подождать.
Завтра снова рутина, как только так сразу вернусь к тебе! Всех обнял!
2 164
Представь, ты работаешь в компании единственным специалистом в своей роле.
Ну, то есть ты ОДИН фронт/бекендер/девопс/qa и т.п. Тимлида в такой ситуации обычно не бывает, максимум есть СТО (техдир) и то он родственник CEO.
ㅤ
Возникает ситуация — ты что-то закомитил, прод уебался. С кого спрос?
Само собой с техдира, а дальше клубочек ведет уже к тебе. И хуй ты там стрелочку переведешь, банально некуда.
А техдир давно не советчик (не помощник), по причине — максимальная деградация и просиживание штанов на созвонах.
Всё что ты получишь:
Что делать с упавшим продом? Естественно чинить самому!
В этой ситуации ты можешь положиться только на себя. Ты тот самый Брюс Уиллис, который полетел в космос и выебал астероид.
Тут уже никто не спрашивает — можешь ты это починить или нет. Ты обязан с этим разобраться и починить. А как? Вообще никого не ебет — предоставьте результат.
Из помощников только гугол, твоя насмотренность и опыт. Больше положиться не на кого, ты гуглиш, экспериментируешь, по итогу чинишь всё это дерьмище и чилиш.
Ну и надеешься чтобы на ретро тебя в жопу не выебали.
Ситуация вторая
Ты не единственный специалист в своей роле. Аналогично, ты что-то запушил в мастер и все уебалось.
Что ты делаешь? Пытаешься починить, не выходит, еще раз пытаешься, гуглишь, используешь нейросети, становится только хуже…
Следующий твой шаг — делегируешь свой факап своему коллеге (коллегам, тегаешь всех
Это сразу провальный вариант!
➡️ Если что-то сломал — чини сам! Это аксиома!
Но опять же если это прод, не грех посоветоваться с коллегами, если такие есть. Всеобщими усилиями это поднять, а потом уже жопу свою на ретро отдать на экзекюцию, но не забыть заранее выписать бочку вазелина с Озона.
Короче вывод такой — никогда ни на кого не надейся!
Сразу в башке носи мысль — ты один и разбираться с этим тебе одному.
Такой подход неистово качает твой скиллз и ты никогда не будешь зависеть ни от кого. И это очень ценный навык в айти, кем бы ты ни был.
Как только ты станешь самостоятельным, тебе будет похер вообще на всё и на всех, ты будешь Альфа-Ктулху, который решит любую проблему!
Такие дела, нового ничего не сказал, рабочие будни.
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
Ну, то есть ты ОДИН фронт/бекендер/девопс/qa и т.п. Тимлида в такой ситуации обычно не бывает, максимум есть СТО (техдир) и то он родственник CEO.
ㅤ
Возникает ситуация — ты что-то закомитил, прод уебался. С кого спрос?
Само собой с техдира, а дальше клубочек ведет уже к тебе. И хуй ты там стрелочку переведешь, банально некуда.
А техдир давно не советчик (не помощник), по причине — максимальная деградация и просиживание штанов на созвонах.
Всё что ты получишь:
Алёша, ты чё блядь Супер Марио? Об грибок уебался?
Что делать с упавшим продом? Естественно чинить самому!
В этой ситуации ты можешь положиться только на себя. Ты тот самый Брюс Уиллис, который полетел в космос и выебал астероид.
Тут уже никто не спрашивает — можешь ты это починить или нет. Ты обязан с этим разобраться и починить. А как? Вообще никого не ебет — предоставьте результат.
Из помощников только гугол, твоя насмотренность и опыт. Больше положиться не на кого, ты гуглиш, экспериментируешь, по итогу чинишь всё это дерьмище и чилиш.
Ну и надеешься чтобы на ретро тебя в жопу не выебали.
Ситуация вторая
Ты не единственный специалист в своей роле. Аналогично, ты что-то запушил в мастер и все уебалось.
Что ты делаешь? Пытаешься починить, не выходит, еще раз пытаешься, гуглишь, используешь нейросети, становится только хуже…
Следующий твой шаг — делегируешь свой факап своему коллеге (коллегам, тегаешь всех
@channel), у них опыта больше, наверное посоветуют, разберутся.Это сразу провальный вариант!
Но опять же если это прод, не грех посоветоваться с коллегами, если такие есть. Всеобщими усилиями это поднять, а потом уже жопу свою на ретро отдать на экзекюцию, но не забыть заранее выписать бочку вазелина с Озона.
Короче вывод такой — никогда ни на кого не надейся!
Сразу в башке носи мысль — ты один и разбираться с этим тебе одному.
Такой подход неистово качает твой скиллз и ты никогда не будешь зависеть ни от кого. И это очень ценный навык в айти, кем бы ты ни был.
Как только ты станешь самостоятельным, тебе будет похер вообще на всё и на всех, ты будешь Альфа-Ктулху, который решит любую проблему!
Такие дела, нового ничего не сказал, рабочие будни.
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 152
К предыдущему посту было написано достаточно много полезных комментариев и один из них представляет собой очень достойный чек-лист от Андрея по разбору инцидентов.
Что делать если все сломалось? 👇
https://blog.bashdays.ru/сhto_delat_esli_vse_slomalos/
Что делать если все сломалось? 👇
https://blog.bashdays.ru/сhto_delat_esli_vse_slomalos/
Когда в Bash ты сравниваешь две переменные, важно не проебаться с кавычками.
В этом примере если переменная
Логично вылезет ошибка, потому что «=» ожидает два значения. Чтобы избежать этой ситуации, на помощь приходят — кавычки.
Теперь всё в поряде. Ошибки никакой нет.
Но Bash не пальцем деланный, поэтом сравнить две переменные можно иначе.
Теперь кавычки нахуй не нужны. Но опять же если в переменной будут спецсимволы, то тебя ожидают грабли.
Есть еще легаси способ:
В современном мире ты вряд ли с ним столкнешься, но в каких-то допотопных скриптах вполне можешь найти.
Если
А с
А если сделать так:
Получишь ошибку:
Все это справедливо для Bash. Если пишешь под sh, то твой путь это одинарные скобки
ㅤ
А еще в двойных скобках можно использовать шаблоны:
Вернёт
Либо написать сложное условие:
В одинарных кавычках это выглядело бы так:
Выводы:
Всё что тебе нужно знать это первые два способа:
Это трувей, бестпрактика и мастхев.
Изучай.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
[ $foo = "bar" ]
В этом примере если переменная
$foo будет пустой, то по итогу ты попадешь в просак:[ = "bar" ]
bash: [: =: unary operator expected
Логично вылезет ошибка, потому что «=» ожидает два значения. Чтобы избежать этой ситуации, на помощь приходят — кавычки.
[ "$foo" = "bar" ]
Теперь всё в поряде. Ошибки никакой нет.
Но Bash не пальцем деланный, поэтом сравнить две переменные можно иначе.
[[ $foo == bar ]]
Теперь кавычки нахуй не нужны. Но опять же если в переменной будут спецсимволы, то тебя ожидают грабли.
Есть еще легаси способ:
[ x"$foo" = x"bar" ]
В современном мире ты вряд ли с ним столкнешься, но в каких-то допотопных скриптах вполне можешь найти.
Если
$foo пустая, то без x получится:[ = bar ]
А с
x будет:[ x = xbar ]
В [[ ... ]] переменные не разделяются на слова, даже если содержат пробелы.
foo="hello bashdays"
[[ $foo = "hello bashdays" ]]
А если сделать так:
foo="hello bashdays"
[ $foo = "hello bashdays" ]
Получишь ошибку:
bash: [: too many argumentsВсе это справедливо для Bash. Если пишешь под sh, то твой путь это одинарные скобки
[...].ㅤ
А еще в двойных скобках можно использовать шаблоны:
foo="hello bashdays"
[[ $foo == h* ]]
Вернёт
true, потому что foo начинается с «h».Либо написать сложное условие:
[[ $foo = "bar" || $bar = "baz" ]]
В одинарных кавычках это выглядело бы так:
[ "$foo" = "bar" -o "$bar" = "baz" ]
Выводы:
Всё что тебе нужно знать это первые два способа:
[ "$foo" = "bar" ]
[[ $foo == bar ]]
Это трувей, бестпрактика и мастхев.
Изучай.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Представь что у тебя есть переменная:
И в скрипте мы делаем так:
Это ошибочный вариант, бэд мать его практика.
Команда
ㅤ
НО! Результат этой команды разбивается на части, если в нём есть пробелы.
Например:
Выдаст:
А если так:
Логично, получаем ошибку:
Bash думает что это два отдельных слова, а не один путь.
➡️ Бест-практика
1. Кавычки защищают результат команды от разбиения.
2. И
Как работают кавычки
- Когда Bash видит
- Кавычки внутри
- Кавычки снаружи не объединяются с внутренними.
Наглядно, можно представить так:
Внутренние кавычки
Внешние кавычки
Теперь даже если переменная будет содержать пробелы команда не разобьётся на части.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
f="My Documents/file.txt"
И в скрипте мы делаем так:
cd $(dirname "$f")
Это ошибочный вариант, бэд мать его практика.
Команда
cd $(dirname "$f") должна вернуть путь к папке, где лежит файл.ㅤ
НО! Результат этой команды разбивается на части, если в нём есть пробелы.
Например:
dirname "My Documents/file.txt"
Выдаст:
My DocumentsА если так:
cd My Documents
Логично, получаем ошибку:
cd: No such file or directory: MyBash думает что это два отдельных слова, а не один путь.
cd -P -- "$(dirname -- "$f")"
1. Кавычки защищают результат команды от разбиения.
2. И
cd получит целый путь, даже если в нём есть пробелы.Как работают кавычки
- Когда Bash видит
$(...), он воспринимает это как отдельную область, некий «уровень».- Кавычки внутри
$(...) работают только внутри.- Кавычки снаружи не объединяются с внутренними.
Наглядно, можно представить так:
cd "$( dirname "$f" )"
Внутренние кавычки
"$f" защищают переменную fВнешние кавычки
"" защищают результат dirname "$f"Теперь даже если переменная будет содержать пробелы команда не разобьётся на части.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Представь, что у тебя есть две коробки. На одной написано «хуи дрочёны», а на другой «пики точены».
Ты хочешь проверить:
ㅤ
— В первой коробке хуи?
— Во второй коробке пики?
Если оба условия верны, ты говоришь — заебись!.
Бэд практика:
Тут
Бест-практика:
Разделяем на две проверки:
Сначала проверяется первое условие, затем второе.
Если оба верны — команда выполнится.
Либо делаем конкретно под Bash:
Здесь можно использовать
Выводы:
Если используешь
Если
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
Ты хочешь проверить:
ㅤ
— В первой коробке хуи?
— Во второй коробке пики?
Если оба условия верны, ты говоришь — заебись!.
Бэд практика:
[ "хуи" = "коробка1" -a "пики" = "коробка2" ]
Тут
-a (И) считается устаревшим и в некоторых случаях это работать не будет. Так что если такое видишь или пишешь, сразу сноси, это хуйня!Одна из проблем с [ A = B -a C = D ] (или -o) в том, что POSIX не определяет, как должна работать команда [ ... ], если у неё больше 4 аргументов.
Бест-практика:
Разделяем на две проверки:
[ "коробка1" = "хуи" ] && [ "коробка2" = "пики" ]
Сначала проверяется первое условие, затем второе.
Если оба верны — команда выполнится.
Либо делаем конкретно под Bash:
[[ "коробка1" = "хуи" && "коробка2" = "пики" ]]
Здесь можно использовать
&&, всё будет работать правильно.Выводы:
Если используешь
[ ... ], то делай две отдельные проверки.Если
[[ ... ]], то можно писать всё внутри.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Если написать так
ㅤ
Двойные скобки
➡️ Бест-практика
А если хочется прям строго соответствовать POSIX, делай так:
Теперь давай разберемся почему с
Символ
В
Еще пример:
Если
Код выше проверяет, является ли переменная
Выводы: для работы с числами используем
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
[[ $foo > 7 ]], то далеко не факт что это правильно отработает.ㅤ
Двойные скобки
[[ ... ]] в Bash предназначен для проверки условий, но не для работы с числами. Для чисел лучше хуячить (( ... )).(( foo > 7 ))
А если хочется прям строго соответствовать POSIX, делай так:
[ "$foo" -gt 7 ]
Теперь давай разберемся почему с
[[ $foo > 7 ]] словишь ошибку.Символ
> в [[ ... ]] сравнивает строки, а не числа. Например, "10" < "7", потому что 1 идёт раньше 7 в алфавите.В
[...] символ > вообще означает «перенаправление вывода», и создаст файл с именем 7 в текущей папке.Еще пример:
case $foo in
("" | *[!0123456789]*) echo "Ошибка: foo не число!" && exit 1 ;;
*) [ "$foo" -gt 7 ] ;;
esac
Если
$foo содержит что-то вроде $(rm -rf /), то при определённых условиях это может привести к пиздецу. Поэтому перед проверкой лучше убедиться, что $foo — это число.Код выше проверяет, является ли переменная
$foo числом, и если да, сравнивает её с 7.case $foo in — конструкция для проверки значений переменной $foo по шаблонам.
"" — пустая строка (если $foo пустое).
("" | *[!0123456789]*) — строка, содержащая хотя бы один символ, который не цифра (например, abc, 12a3).
Если условие выполняется, выводится сообщение "Ошибка: foo не число!", и скрипт завершает работу с кодом 1 (exit 1).
* — означает «всё остальное» (то есть, если $foo не попал под первый шаблон).
[ "$foo" -gt 7 ] — проверяет, больше ли $foo чем 7.
Выводы: для работы с числами используем
(( ... )) или [ "$foo" -gt 7 ], а переменные перед проверкой лучше очищать от лишних символов.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем делать правильно.
ㅤ
Этот код выглядит вполне нормально:
Он считает, сколько строк в файле
Здесь главная проблема — переменная
Если простым языком: Каждая часть, разделённая
Этот код вернет 0, несмотря на
Как быть?
Первый вариант:
Эта штука говорит интерпретатору — что последний элемент конвейера будет выполнен в окружении текущей оболочки.
Второй вариант:
Вообще избавиться от
Можно еще наколхозить и передавать значения через временный файл, но это прям пиздец шляпа и костыль.
Выводы
Нужно просто посчитать строки:
Нужно обрабатывать строки:
Хочешь использовать pipe:
Вот и вся наука.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
ㅤ
Этот код выглядит вполне нормально:
grep foo bar.txt | while read -r; do ((count++)); done
Он считает, сколько строк в файле
bar.txt содержат слово foo.Здесь главная проблема — переменная
count не изменится вне цикла while, потому что в Bash каждая команда в пайплайне (|) запускается в отдельной оболочке (subshell). То есть count++ происходит «внутри», и снаружи этого не видно.Если простым языком: Каждая часть, разделённая
|, запускается в отдельной «коробке» (subshell). То есть while работает внутри своей коробки. B всё что там происходит, не видно снаружи.Некоторые оболочки ksh93 или Bash с включённой настройкой shopt -s lastpipe работают по-другому — цикл выполняется в той же оболочке, и тогда count изменится.
count=0
echo -e "one\ntwo\nthree" | while read line; do ((count++)); done
echo $count
Этот код вернет 0, несмотря на
count++, а вот например в zsh вернется 3.Как быть?
Первый вариант:
shopt -s lastpipe
Эта штука говорит интерпретатору — что последний элемент конвейера будет выполнен в окружении текущей оболочки.
Второй вариант:
Вообще избавиться от
while и всё сделать через grep:count=$(grep -c foo bar)
echo $count
Можно еще наколхозить и передавать значения через временный файл, но это прям пиздец шляпа и костыль.
Выводы
Нужно просто посчитать строки:
count=$(grep -c foo bar)
Нужно обрабатывать строки:
while read line; do ...; done < bar
Хочешь использовать pipe:
shopt -s lastpipe
Вот и вся наука.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Вот те на!
Большинство думает, что
ㅤ
В Bash
Скобка
Команда выше напечатает
Теперь о главном
Если хочешь использовать
Плохая практика:
Внутри
Хорошая практика:
Если
И Всё работает как надо, без лишних скобок!
Выводы
Никогда не пиши
Пиши просто
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
if [ false ]; then echo "HELP"; fi
Большинство думает, что
[ — это часть команды if как скобки в других языках программирования. Но нихуя!ㅤ
В Bash
if просто запускает команду. Команда [ ... ] — это обычный бинарник, аналогично команде test, а не специальный синтаксис. Скобка
] нужна только для красоты и завершения команды [.Команда выше напечатает
HELP, потому что строка "false" — непустая, а значит, условие считается истинным.Теперь о главном
Если хочешь использовать
grep в if, не надо писать скобки!Плохая практика:
if [ grep -q "foo" myfile ]; then
echo "Найдено!"
fi
[... ] — ожидает условие, а не командуgrep — это команда, а не логическое выражениеВнутри
[ запускать команды нельзя — это приведёт к ошибкеХорошая практика:
if grep -q "foo" myfile; then
echo "Найдено!"
fi
if просто запускает grepЕсли
grep нашёл совпадение, он вернёт 0 (успех), и выполнится thenИ Всё работает как надо, без лишних скобок!
[ — это как калькулятор, а grep — это поиск. В калькуляторе искать бесполезно!Выводы
Никогда не пиши
if [ grep ... ] — это ошибка!Пиши просто
if grep ..., чтобы проверить результат команды.if работает с командами. [ — это тоже команда, но не синтаксис.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
2 83