Forwarded from Записки админа
🗜 Shell Script Best Practices - ещё некоторое количество бестпрактис для написания скриптов. #shell #bash #напочитать
sharats.me
Shell Script Best Practices — The Sharat's
This article is about a few quick thumb rules I use when writing shell scripts that I’ve come to appreciate over the years. Very opinionated....
👍1
Forwarded from Записки админа
🛠 5 Tips to Write Better Bash Scripts - с одной стороны, очевидные, с другой стороны не становящиеся от этого менее полезными рекомендации для написания скриптов. #bash #script #напочитать
👍2👎1
Forwarded from Записки админа
⚙️ 5 Bash Coding Techniques That Every Programmer Should Know.
Ещё немного советов и рекомендаций для написания bash скриптов...
https://levelup.gitconnected.com/5-bash-coding-techniques-that-every-programmer-should-know-f63b11b59e8d
#bash #будничное #напочитать
Ещё немного советов и рекомендаций для написания bash скриптов...
https://levelup.gitconnected.com/5-bash-coding-techniques-that-every-programmer-should-know-f63b11b59e8d
#bash #будничное #напочитать
Forwarded from Записки админа
🛠 5 Bash String Manipulation Methods That Help Every Developer.
Немного bash полезностей в ленту...
https://levelup.gitconnected.com/5-bash-string-manipulation-methods-that-help-every-developer-49d4ee38b593
Но да, башизмами как всегда - использовать их конечно же можно, но не перебарщивая.
#bash #shell #напочитать
Немного bash полезностей в ленту...
https://levelup.gitconnected.com/5-bash-string-manipulation-methods-that-help-every-developer-49d4ee38b593
Но да, башизмами как всегда - использовать их конечно же можно, но не перебарщивая.
#bash #shell #напочитать
Forwarded from Bash Days | Linux | DevOps (Роман Шубин)
Как в 20 выглядеть на 40?
Правильно! Установить Linux!
Я всегда обходил стороной команду find, наверное потому что я никогда не умел ее готовить. Мне всегда было проще находить нужное в midnight commander.
Но для bash скриптов mc это не панацея, поэтому изредка приходилось гуглить про find и что-то лепить.
Сегодня затрём как раз про find. Но не за Базу, а за его скорость и бест-практики.
С помощью find мы ищем по разным паттернам и условиям. Порой необходимо совершить какие-то действия с найденными результатами. И find не может нас этим порадовать. Приходится передавать данные внешним утилитам.
У find есть пару опций:
exec = запускает утилиту и передает в неё аргументы
execdir = перед запуском утилиты, переходит в каталог с найденным
Синтаксис этих штук такой:
команда = утилита, которую запускаем
{} = развернется в найденные файлы
; = суффикс, на каждый файл запускается команда
+ = суффикс, команда запускается с группой файлов
Хорош с теорией, погнали в практику:
Эта команда будет искать обычные файлы в домашнем каталоге пользователя. Утилитой для обработки, у нас будет интерпретатор, который выведет на экран идентификатор процесса. Интерпретатор используем чисто в лабораторных целях.
По итогу на экран я получил 100500 строчек такого вида:
Это список процессов, которые были задействованы в результате поиска. Чёто прям дохуя. Если надоело ждать результата, жми CTRL+C.
✔️ А теперь давай оптимизируем!
По итогу я получаю одну цифру
Но что произошло? Ща объясню. В оптимизированном варианте, имена файлов разбиваются на максимально большие группы и затем передаются в утилиту. Вот в этом и есть разница.
Ведь, чтобы запустить внешнюю утилиту, нужно совершить кучу лишний телодвижений. Если запускать на каждый найденный файл отдельный процесс, то тратится куча ресурсов, причем зря. Естественно это прилично влияет на скорость.
Проще ведь сразу скормить утилите группу найденных файлов и никому не ебать мозги.
Стопэ. Это еще не всё, можно еще больше разогнать 👇
Включаем режим оверклоакинга!
Будем использовать утилиту xargs, она как раз входит в пакет с find. Утилита xargs запускает процессы параллельно. Уже понимаешь чо щас будет?
Xargs читает стандартный ввод и разбивает его на группы аргументов. А после этого запускает команду с данной группой аргументов.
По ключам:
0 = аргументы разделяются символами NUL ASCII. А спецсимволы косой черты
n = максимально количество аргументов переданных за один раз
P = максимально количество процессов запущенных одновременно. Если указать 0, запустится как можно больше таких процессов.
команда = внешняя команда которая будет запущена. Если ничего не указывать, на экран выведутся группы аргументов, удобная фича для отладки.
А еще если во время работы xargs, ей послать сигнал SIGUSR1 (kill), то количество одновременно запускаемых процессов будет увеличено. А для SIGUSR2, будет уменьшено.
Это базовая команда для правильной работы find + xargs:
Но учти, если command у тебя будет оболочкой sh/bash, тогда нужно правильно обработать аргументы и учесть всякие splitting, globbing и т.п.
Ладно чо. Всем хорошего отдыха и заебатых шашлычков. На 01.05 я возьму отгул, а там дальше уже всё по плану: за кишочки подергаем, да на страусе (strace) покатаемся. Будет охуенно!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Правильно! Установить Linux!
Я всегда обходил стороной команду find, наверное потому что я никогда не умел ее готовить. Мне всегда было проще находить нужное в midnight commander.
У меня кстати даже постов про find не было в этом канале.
Но для bash скриптов mc это не панацея, поэтому изредка приходилось гуглить про find и что-то лепить.
Сегодня затрём как раз про find. Но не за Базу, а за его скорость и бест-практики.
С помощью find мы ищем по разным паттернам и условиям. Порой необходимо совершить какие-то действия с найденными результатами. И find не может нас этим порадовать. Приходится передавать данные внешним утилитам.
У find есть пару опций:
exec = запускает утилиту и передает в неё аргументы
execdir = перед запуском утилиты, переходит в каталог с найденным
Синтаксис этих штук такой:
-exec команда {} суффикскоманда = утилита, которую запускаем
{} = развернется в найденные файлы
; = суффикс, на каждый файл запускается команда
+ = суффикс, команда запускается с группой файлов
Символ ; обязательно нужно экранировать либо поместить в кавычки.
Хорош с теорией, погнали в практику:
find ~/ -type f -exec sh -c 'echo $$' {} \;Эта команда будет искать обычные файлы в домашнем каталоге пользователя. Утилитой для обработки, у нас будет интерпретатор, который выведет на экран идентификатор процесса. Интерпретатор используем чисто в лабораторных целях.
По итогу на экран я получил 100500 строчек такого вида:
26719
26720
26721
Это список процессов, которые были задействованы в результате поиска. Чёто прям дохуя. Если надоело ждать результата, жми CTRL+C.
find ~/ -type f -exec sh -c 'echo $$' {} +По итогу я получаю одну цифру
27413, один идентификатор процесса, в отличие от предыдущего варианта. Круто? Да охуеть не встать!Но что произошло? Ща объясню. В оптимизированном варианте, имена файлов разбиваются на максимально большие группы и затем передаются в утилиту. Вот в этом и есть разница.
Ведь, чтобы запустить внешнюю утилиту, нужно совершить кучу лишний телодвижений. Если запускать на каждый найденный файл отдельный процесс, то тратится куча ресурсов, причем зря. Естественно это прилично влияет на скорость.
Проще ведь сразу скормить утилите группу найденных файлов и никому не ебать мозги.
Стопэ. Это еще не всё, можно еще больше разогнать 👇
Включаем режим оверклоакинга!
Будем использовать утилиту xargs, она как раз входит в пакет с find. Утилита xargs запускает процессы параллельно. Уже понимаешь чо щас будет?
find ~/ -type f -print0 | xargs -0 -n4 -P2 команда
Xargs читает стандартный ввод и разбивает его на группы аргументов. А после этого запускает команду с данной группой аргументов.
По ключам:
0 = аргументы разделяются символами NUL ASCII. А спецсимволы косой черты
\ и кавычками, воспринимаются как обычные.n = максимально количество аргументов переданных за один раз
P = максимально количество процессов запущенных одновременно. Если указать 0, запустится как можно больше таких процессов.
команда = внешняя команда которая будет запущена. Если ничего не указывать, на экран выведутся группы аргументов, удобная фича для отладки.
А еще если во время работы xargs, ей послать сигнал SIGUSR1 (kill), то количество одновременно запускаемых процессов будет увеличено. А для SIGUSR2, будет уменьшено.
SIGUSR1 и SIGUSR2 могут быть использованы программой для произвольных нужд, например для межпроцессной (или межпоточной) синхронизации, управления фоновыми процессами (демонами) и т. п. По умолчанию, сигналы SIGUSR1 и SIGUSR2 завершают выполнение процесса.
Это базовая команда для правильной работы find + xargs:
find -print0 | xargs -0 command
Но учти, если command у тебя будет оболочкой sh/bash, тогда нужно правильно обработать аргументы и учесть всякие splitting, globbing и т.п.
Ладно чо. Всем хорошего отдыха и заебатых шашлычков. На 01.05 я возьму отгул, а там дальше уже всё по плану: за кишочки подергаем, да на страусе (strace) покатаемся. Будет охуенно!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3👎1
Forwarded from Bash Days | Linux | DevOps (Роман Шубин)
Принцесса для снятия стресса
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Например:
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
➡️ Посмотреть можешь тут.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
А потом использовать сразу в командах:
Есть еще такая штука:
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
🔔 @bashdays➡️ @gitgate
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Docker генерирует случайные имена для контейнеров, используя сочетание прилагательных и фамилий известных учёных или инженеров.
<прилагательное><фамилия> и всегда написаны в нижнем регистре.Например:
quirky_pare
agitated_turing
furious_heisenberg
romantic_curie
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
goto begin
}Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
#!/bin/bash
adjectives=(
"adoring" "agitated" "amazing" "angry" "awesome" "blissful" "bold"
"boring" "brave" "clever" "cool" "compassionate" "competent" "crazy"
"dazzling" "determined" "ecstatic" "elegant" "eloquent" "epic"
"exciting" "fervent" "focused" "furious" "gallant" "gifted" "goofy"
"gracious" "happy" "hardcore" "hopeful" "hungry" "infallible" "inspiring"
"jolly" "jovial" "keen" "kind" "laughing" "loving" "magical"
"mystifying" "naughty" "nervous" "nostalgic" "optimistic" "peaceful"
"practical" "priceless" "quirky" "recursing" "relaxed" "reverent"
"sad" "serene" "sharp" "silly" "sleepy" "stoic" "strange" "stupefied"
"suspicious" "tender" "thirsty" "trusting" "unruffled" "vibrant"
"vigilant" "wizardly" "wonderful" "youthful" "zealous" "zen"
)
scientists=(
"albattani" "allen" "archimedes" "ardinghelli" "babbage" "bashdays" "banach"
"banzai" "bardeen" "bartik" "bassi" "bell" "benz" "bhabha" "bhaskara"
"blackwell" "bohr" "booth" "borg" "bose" "boyd" "brahmagupta" "brattain"
"brown" "carson" "chandrasekhar" "colden" "cori" "cray" "curie"
"darwin" "davinci" "dijkstra" "dubinsky" "easley" "einstein"
"elion" "engelbart" "euclid" "euler" "fermat" "fermi" "feynman"
"franklin" "galileo" "galois" "goldberg" "goodall" "hawking"
"heisenberg" "hermann" "herschel" "hertz" "hodgkin" "hoover" "hopper"
"hypatia" "joliot" "kalam" "keller" "kowalevski" "lalande" "leavitt"
"lichterman" "liskov" "lovelace" "mayer" "mccarthy" "mcclintock"
"mclean" "mcnulty" "meitner" "mendel" "mendeleev" "minsky" "mirzakhani"
"moore" "napier" "newton" "nobel" "noether" "panini" "pare"
"pasteur" "payne" "perlman" "pike" "poincare" "ptolemy" "raman"
"ramanujan" "ride" "ritchie" "roentgen" "rosalind" "saha"
"sammet" "shockley" "sinoussi" "stallman" "stonebraker" "swanson"
"tesla" "thompson" "torvalds" "turing" "varahamihira" "visvesvaraya"
"wilbur" "wiles" "williams" "wilson" "wing" "wozniak" "wright"
"yonath"
)
generate_container_name() {
local adjective="${adjectives[RANDOM % ${#adjectives[@]}]}"
local scientist="${scientists[RANDOM % ${#scientists[@]}]}"
echo "${adjective}_${scientist}"
}
count=${1:-10}
for ((i=1; i<=count; i++)); do
generate_container_name
done
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
pizdatiy_huy или ohuennaya_pizda.А потом использовать сразу в командах:
docker run --name $(bash script.sh) -d nginx
Есть еще такая штука:
alias dn='curl -s https://frightanic.com/goodies_content/docker-names.php'
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👎15👍11❤3