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

Я уже более десяти лет веду собственные дотфайлы [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 off, wifi 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 в 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 off, wifi 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
Нажмите здесь для печати.