- PVSM.RU - https://www.pvsm.ru -

Мои личные скрипты для повседневной работы

Мои личные скрипты для повседневной работы - 1

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

Буфер обмена

copy [2] и pasta [3] — это простые обёртки для менеджеров системного буфера обмена вроде pbcopy в macOS и xclip в Linux. Я использую их постоянно.

# Общие примеры.
run_some_command | copy
pasta > file_from_my_clipboard.txt

# Копирование содержимого файла.
copy < file.txt

# Открытие пути файла из буфера обмена.
vim "$(pasta)"

# Декодирование base64 из буфера обмена.
pasta | base64 --decode

pastas [4] выводит текущее состояние буфера обмена в stdout и затем при каждом изменении буфера также выводит новую версию. Этот инструмент я использую где-то раз в неделю.

# Общий пример.
pastas > everything_i_copied.txt

# Скачивает содержимое каждой ссылки, которую я копирую в буфер обмена.
pastas | wget -i -

cpwd [5] копирует адрес текущего каталога в буфер обмена. По сути, это pwd | copy. Я часто так делаю, когда хочу использовать текущий каталог в другой вкладке терминала. То есть я копирую адрес в одной вкладке и перехожу по нему через cd в другой. Пригождается где-то раз в день.

Управление файлами

mkcd foo [6] создаёт каталог и переходит в него через cd. По сути, это команда mkdir foo && cd foo. Я этим скриптом пользуюсь постоянно — почти при каждом создании каталога.

tempe [7] создаёт временный каталог и переключается на него. По существу, это команда cd "$(mktemp -d)". Её я часто использую, когда нужно проделать какую-то временную работу, чтобы потом вручную всё не подчищать. Вот пара типичных примеров:

# Скачивание и извлечение файла.
tempe
wget 'https://example.com/big_file.tar.xz'
tar -xf big_file.tar.xz
# ...какие-то действия с файлом...

# Написание быстрого одноразового скрипта для экспериментов.
tempe
vim foo.py
python3 foo.py

trash a.txt b.png [8] отправляет a.txt и b.png в корзину. Работает в macOS и Linux. Этим скриптом я пользуюсь каждый день, причём явно чаще, чем rm. Полезная штука — защищает от случайного удаления файлов.

mksh [9] позволяет быстро создавать скрипты оболочки. К примеру, mksh foo.sh создаёт foo.sh, делает его исполняемым с помощью chmod u+x, добавляет префиксы Bash и открывает скрипт в редакторе (в моём случае Vim). Пригождается раз в несколько дней. Многие из перечисленных в этой статье скриптов были созданы с помощью mksh.

Интернет

serveit [10] запускает на порту localhost:8000 статический файловый сервер, предоставляющий доступ к файлам текущего каталога. По сути, это команда python3 -m http.server 8000, только в этом случае скрипт обрабатывает сценарии, когда Python не установлен, используя вместо него другие программы. Мне этот инструмент пригождается несколько раз в неделю. Если вы не веб-разработчик, то вам он может оказаться не так полезен.

getsong [11] использует yt-dlp для скачивания музыки в максимальном доступном качестве с таких ресурсов, как YouTube или SoundCloud. Например, getsong https://www.youtube.com/watch?v=dQw4w9WgXcQ скачает указанный ролик в виде трека. Я пользуюсь этим скриптом несколько раз в неделю. Обычно для скачивания саундтреков к играм.

getpod [12] также с помощью yt-dlp скачивает какие-нибудь записи для проигрывателя подкастов. Пригождается несколько раз в месяц.

getsubs [13] скачивает английские субтитры к видео. Этот скрипт хорош тем, что сначала ищет «официальные» субтитры и только потом использует сгенерированные. Иногда я считываю субтитры вручную, иногда выполняю getsubs https://video.example/foo | ollama run llama3.2 "Summarize this", а иногда использую этот скрипт просто для генерации описания к видео, которое не хочу сохранять на ПК. Пригождается раз в несколько дней.

wifi offwifi on и wifi toggle [14] помогают с управлением WiFi. wifi toggle я обычно использую, когда возникают траблы с интернетом. Благо, в этих целях пригождается он где-то всего раз в месяц.

url "$my_url" [15] парсит URL-адрес на составляющие части. Использую примерно раз в месяц для получения информации об URL, зачастую просто потому, что не хочу кликать по ссылке с трекером.

url 'https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123'
# original: https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123
# protocol: https
# hostname: evil.example
# path: /track-user-link
# query: url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba
# - url https://url-i-want-to-visit.example
# - track 06f8582a-91e6-4c9c-bf8e-516884584aba
# hash: cookie=123

Обработка текста

line 10 [16] выводит строку 10 из stdin. Например, cat some_big_file | line 10 выводит 10 строку файла. Думаю, такая возможность должна быть встроенной — как команды head и tail. Использую её где-то раз в месяц.

scratch [17] открывает временный буфер Vim. По сути, это алиас для $EDITOR $(mktemp). Пригождается почти каждый день для оперативной обработки текста или для написания временной заметки.

straightquote [18] преобразует «умные кавычки» в “прямые”. Вообще, меня этот нюанс не особо волнует, но иногда такие кавычки просачиваются в код, с которым я работаю. Кроме того, их изменение в прямые позволяет чуть уменьшить размер файла, что порой весьма актуально. Мне эта функция пригождается как минимум раз в неделю.

markdownquote [19] добавляет > перед каждой строкой. Пользуюсь этим скриптом в Vim постоянно. Я выбираю нужный фрагмент и выполняю :'<,'>!markdownquote, чтобы сделать выбранный текст цитатой. Пригождается где-то раз в неделю.

length foo [20] возвращает 3 (пожалуй, нужно просто использовать wc -c.)

jsonformat [21] получает JSON из stdin и в красивом виде выводит через stdout. Использую этот скрипт несколько раз в год.

uppered [22] и lowered [23] преобразуют строки в нижний и верхний регистр. Например, echo foo | uppered возвращает FOO. Пригождается раз в неделю.

nato bar [24] возвращает Bravo Alfa Romeo. Обычно использую при общении со службой поддержки, когда нужно вывести длинную строку из букв и цифр, что за всю жизнь мне приходилось делать всего несколько раз. Но иногда выручает!

u+ 2025 [25] возвращает ñ, LATIN SMALL LETTER N WITH TILDE. Быстрый способ поиска строки Юникода. Этот скрипт пригождается редко — может, раз в месяц.

snippets foo [26] выводит содержимое ~/.config/evanhahn-snippets/foo. Я использую snippet arrow в качестве snippet recruiter в качестве быстрого ответа рекрутёрам “not interested”snippet lorem для вывода блока “Lorem ipsum” и ещё несколько других. В неделю пригождается пару раз.

Лаунчеры REPL

Вдохновлённый интерактивной оболочкой REPL в Ruby, я создал несколько лаунчеров:

  • iclj [27] запускает Clojure REPL,

  • ijs [28] запускает Deno REPL (или Node REPL, если Deno отсутствует),

  • iphp [29] запускает PHP REPL,

  • ipy [30] запускает Python REPL,

  • isql [31] запускает оболочку SQLite (алиас для sqlite3 :memory:).

Дата и время

hoy [32] выводит текущую дату в формате ISO, например, 2020-04-20. Им я пользуюсь постоянно, так как люблю добавлять в начало названий файлов текущую дату.

timer 10m [33] запускает таймер на 10 минут, затем воспроизводит рингтон и отправляет системное уведомление (подробнее в notify ниже). Я также регулярно использую команду bb timer 5m, чтобы запустить пятиминутный таймер в фоновом режиме (подробнее о bb ниже). В целом этот скрипт пригождается мне почти каждый день в качестве эффективного инструмента отслеживания времени.

rn [34] выводит текущее время и дату, используя date и cal. Пригождается где-то раз в неделю. Вот пример его выдачи:

4:20PM on Wednesday, October 22, 2025

    September 2025
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Аудио, видео и изображения

ocr my_image.png [35] извлекает из изображения текст и выводит его в stdout. К сожалению, работает только в macOS, но я планирую это исправить. (Вот отдельная статья [36], посвящённая этому скрипту).

boop [37] (алиас, не скрипт оболочки). Если команда была выполнена успешно, издаёт мажорный звук, в противном случае — минорный. Я применяю его, например, так: run_the_tests ; boop, чтобы понять, успешно ли завершились тесты. Он также пригождается при выполнении длительных команд, так как об их завершении уведомлений не поступает. Использую его постоянно.

sfx foo [38], по сути, просто воспроизводит ~/.config/evanhahn-sfx/foo.ogg. Применяется в описанных выше boop и timer.

tunes [39] воспроизводит аудио из файла с помощью mpv. Использую постоянно через команду --shuffle ~/music.

pix [40] показывает изображение с помощью mpv. Пригождается несколько раз в неделю для просмотра фото.

radio [41] — небольшая обёртка для моих любимых станций radio lofi и radio salsa. Использую несколько раз в месяц.

speak [42] считывает данные из stdin, удаляет всё форматирование Markdown и передаёт их в механизм речевого синтеза (say в macOS и espeak-ng в Linux). Пользуюсь этим несколько раз в месяц, обычно, когда нет возможности вычитать собственный текст вслух [43].

shrinkvid [44] — обёртка ffmpeg, немного сжимающая видео. Пригождается где-то раз в месяц.

removeexif [45] удаляет из JPEG данные EXIF. Пользуюсь этой штукой редко, отчасти, потому что она не удаляет EXIF из файлов других форматов вроде PNG. Но я рассчитываю однажды её доработать, поэтому пока держу на вооружении.

tuivid [46] — этот скрипт позволяет смотреть видео в терминале, но я его почти не использую. Хотя при всей своей странности он мне нравится.

Управление процессами

each [47] — мой ответ xargs и find ... -exec, которые я нахожу сложными в работе. Например, ls | each 'du -h {}' выполняет du -h для каждого файла в каталоге. Пользуюсь этим решением я редко, но регулярно мучаюсь с xargs, так что это неплохая альтернатива.

running foo [48] аналогичен ps aux | grep foo, но намного читабельнее (лично для меня) — просто выделенный фиолетовым PID и команда.

murder foo or murder 1234 [49] — это обёртка вокруг kill, которая отправляет kill -15 $PID, недолго ожидает, отправляет kill -2, ожидает, отправляет kill -1, и ещё раз ожидает, прежде чем в завершение отправить kill -9. Если я хочу остановить программу, то сначала прошу её об этом вежливо и уже потом грублю. Пригождается несколько раз в месяц.

waitfor $PID [50] — ожидает завершения PID и только потом продолжает выполнение. Также не позволяет системе уйти в режим сна. Я этим скриптом пользуюсь где-то раз в месяц, когда:

# Хочу запустить что-либо только после завершения другого процесса.
waitfor 1234 ; something_else

# Запустил длительный процесс и хочу знать, когда он завершится.
waitfor 1234 ; notify 'process 1234 is done'

bb my_command [51] подобна my_command &, только выполняет команду в глубоком фоновом режиме, совершенно не требуя вашего внимания. Пригождается, когда вам нужно запустить демона или длительный процесс, дальнейшее выполнение которого вы отслеживать не хотите. Чаще всего я применяю этот макрос в виде bb ollama serve и bb timer 5m. В целом пригождается где-то раз в день.

prettypath [52] выводит $PATH, но с разделением строк пробелами для повышения читабельности. Использую этот скрипт в основном при отладке проблем с $PATH, которые случаются редко. Зато, когда такое происходит, он очень выручает.

tryna my_command [53] выполняет my_command, пока та не завершится успешно. trynafail my_command [54], напротив, выполняет my_command, пока та не провалится. Пригождается редко, но в некоторых случаях помогает. tryna wget ... будет пытаться скачать указанный элемент. trynafail npm test останавливает тесты, когда те начинают проваливаться.

Быстрый доступ

emoji [55] помогает находить эмодзи. Например, emoji cool выводит:

😛
😒
😎
🪭
🆒

httpstatus [56] выводит все коды HTTP-состояния. httpstatus 204 выводит 204 No Content. Так как я веб-разработчик, этот скрипт пригождается мне несколько раз в месяц, избавляя от необходимости искать ответ в сети.

alphabet [57] просто выводит английский алфавит в верхнем и нижнем регистре. Кстати, использую я этот инструмент на удивление часто (где-то раз в месяц). Вот его вывод:

abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Управление системой

theme 0 [58] меняет тему системы на тёмную, а theme 1 — на светлую. Причём этот скрипт меняет не только тему ОС, но и темы Vim, Tmux и терминала. Пригождается минимум раз в день.

sleepybear [59] отправляет систему в сон. Работает в macOS и Linux. Использую несколько раз в неделю.

ds-destroy [60] рекурсивно удаляет все файлы .DS_Store в каталоге. Мне не нравится, что macOS захламляет ими папки. Пользуюсь этим скриптом редко, но при необходимости он весьма выручает.

Всякая всячина

catbin foo [61] — это, по сути, cat "$(which foo)". Позволяет просматривать исходный код файла, указанного в PATH (к примеру, я его использовал для написания этой статьи). Пригождается пару раз в месяц.

notify [62] отправляет уведомление от ОС. Применял его в некоторых других скриптах (см. выше). Плюс примерно раз в месяц использую его как-то так:

run_some_long_running_process ; notify 'all done'

uuid [63] выводит UUID v4. Применяю где-то раз в месяц.

А какие скрипты часто используете вы? Поделитесь

Я здесь перечислил лишь те, которыми много пользуюсь сам. Надеюсь, некоторые из них пригодятся и вам.  

Автор: Bright_Translate

Источник [64]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/435418

Ссылки в тексте:

[1] веду собственные дотфайлы: https://evanhahn.com/a-decade-of-dotfiles/

[2] copy: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/copy

[3] pasta: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pasta

[4] pastas: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pastas

[5] cpwd: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/cpwd

[6] mkcd foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L38-L41

[7] tempe: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L43-L51

[8] trash a.txt b.png: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trash

[9] mksh: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/mksh

[10] serveit: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/serveit

[11] getsong: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsong

[12] getpod: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getpod

[13] getsubs: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsubs

[14] wifi offwifi on и wifi toggle: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/wifi

[15] url "$my_url": https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/url

[16] line 10: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/line

[17] scratch: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/scratch

[18] straightquote: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/straightquote

[19] markdownquote: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/markdownquote

[20] length foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/length

[21] jsonformat: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/jsonformat

[22] uppered: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uppered

[23] lowered: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/lowered

[24] nato bar: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/nato

[25] u+ 2025: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/u+

[26] snippets foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/snippets

[27] iclj: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iclj

[28] ijs: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ijs

[29] iphp: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iphp

[30] ipy: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ipy

[31] isql: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/isql

[32] hoy: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/hoy

[33] timer 10m: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/timer

[34] rn: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/rn

[35] ocr my_image.png: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ocr

[36] Вот отдельная статья: https://evanhahn.com/mac-ocr-script/

[37] boop: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L53-L61

[38] sfx foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sfx

[39] tunes: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tunes

[40] pix: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pix

[41] radio: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/radio

[42] speak: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/speak

[43] когда нет возможности вычитать собственный текст вслух: https://evanhahn.com/use-text-to-speech-if-you-cant-proofread-aloud/

[44] shrinkvid: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/shrinkvid

[45] removeexif: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/removeexif

[46] tuivid: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tuivid

[47] each: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/each

[48] running foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/running

[49] murder foo or murder 1234: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/murder

[50] waitfor $PID: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/waitfor

[51] bb my_command: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/bb

[52] prettypath: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/prettypath

[53] tryna my_command: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tryna

[54] trynafail my_command: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trynafail

[55] emoji: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/emoji

[56] httpstatus: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/httpstatus

[57] alphabet: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/alphabet

[58] theme 0: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/theme

[59] sleepybear: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sleepybear

[60] ds-destroy: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ds-destroy

[61] catbin foo: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/catbin

[62] notify: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/notify

[63] uuid: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uuid

[64] Источник: https://habr.com/ru/companies/ruvds/articles/961514/?utm_source=habrahabr&utm_medium=rss&utm_campaign=961514