{"id":29998122,"url":"https://github.com/scorpi-on/linux-shell-labs","last_synced_at":"2026-05-18T00:03:00.675Z","repository":{"id":306910948,"uuid":"1027621469","full_name":"Scorpi-ON/linux-shell-labs","owner":"Scorpi-ON","description":"Several Linux shell scripts. A set of lab works on Operation Systems (Oct 2023, 5th semester of university).","archived":false,"fork":false,"pushed_at":"2025-08-24T17:43:09.000Z","size":86,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-24T21:54:14.539Z","etag":null,"topics":["bash","lab-work","shell","shell-script","university"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Scorpi-ON.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-28T09:32:20.000Z","updated_at":"2025-08-24T17:42:48.000Z","dependencies_parsed_at":"2025-07-28T12:12:08.252Z","dependency_job_id":"d123c29a-1c7b-495e-8591-1bfde663438b","html_url":"https://github.com/Scorpi-ON/linux-shell-labs","commit_stats":null,"previous_names":["scorpi-on/linux-shell-labs"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Scorpi-ON/linux-shell-labs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scorpi-ON%2Flinux-shell-labs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scorpi-ON%2Flinux-shell-labs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scorpi-ON%2Flinux-shell-labs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scorpi-ON%2Flinux-shell-labs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Scorpi-ON","download_url":"https://codeload.github.com/Scorpi-ON/linux-shell-labs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scorpi-ON%2Flinux-shell-labs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33160167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","lab-work","shell","shell-script","university"],"created_at":"2025-08-05T03:37:32.965Z","updated_at":"2026-05-18T00:02:55.667Z","avatar_url":"https://github.com/Scorpi-ON.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# linux-shell-labs\nНабор лабораторных работ по операционным системам, представляющих собой скрипты Linux Shell различной сложности\n\n\u003ch2\u003eПростые команды\u003c/h2\u003e\n\n\u003ch3\u003eЗадание\u003c/h3\u003e\nВ соответствии с вариантом задания написать однострочную команду, расширяющую функциональные возможности ОС Unix.\n\n\u003ch3\u003eЗапуск\u003c/h3\u003e\nДля загрузки команд в оболочку выполните команду из корня репозитория:\n\n```shell\nsource simple.sh\n```\n\nПосле этого они станут доступны.\n\nЧтобы реализовать поддержку скрытых файлов, везде, где применялась команда `ls -l`, необходимо дописать флаг `-A`.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch3\u003eКоманды\u003c/h3\u003e\u003c/summary\u003e\n \n**1.** `lx` **— вывести список файлов указанного каталога, у которых права на чтение, запись и выполнение только для создателя файла (т.е. rwx------), отсортировать их по имени в обратном порядке.**\n\nКоманда ls -lh $1 выводит всё содержание указаного каталога, а grep находит те строки, которые начинаются на -rwx------ (т. е. содержат файлы с требуемым набором прав).\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/f65c2a91-8812-4d78-9031-f25834ffb084\"/\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**2.** `pu` **— посчитать количество процессов, запущенных указанным пользователем.**\n\nКоманда ps с аргументом -u выводит список процессов, запущенных указанным пользователем. Модификатор h убирает заголовок перед списком. Для подсчёта остаётся вызвать команду wc. Флаг -l, означает подсчёт только строк (а не слов и символов).\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/cb2611c9-811b-4c5c-8d79-7b21e35cd850\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**3.** `pt` **— посчитать кол-во процессов, запущенных с указанного терминала.**\n\nКоманда ps c модификатором t выводит список процессов, запущенных с указанного терминала. Для подсчёта вновь используем модификатор h и передачу команде wc.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/9a67365e-6457-4177-baea-5867d9a53aea\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**4.** `nx` **— количество исполнимых файлов в указанном каталоге.**\n\nС помощью ls -l $1 выведем содержимое указанного каталога. Командой grep с шаблоном «^-.*x.* » найдём все строки, начинающиеся на - (такие строки описывают файлы) и содержащие x в триадах прав (хотя бы одна x означает, что файл является исполняемым для одной из групп пользователей). Флаг -с команды grep означает, что нужно вывести только число найденных строк.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/7b019955-2ee5-4677-ad59-e985868d397d\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**5.** `npu` **— посчитать количество терминированных процессов, запущенных указанным пользователем.**\n\nТерминированные процессы имеют статус T в списке процессов. Поскольку нам необходимо узнать их количество, воспользуемся аргументом -o и передадим ему одно поле — stat (статус процесса). Аргумент -u $1 выведет процессы указанного пользователя. Остаётся найти количество нужных статусов при помощи grep -c ‘^T’.\nНа скриншоте было создано и прервано 3 процесса, чтобы продемонстрировать работу скрипта.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/3b0b33e6-e2e6-4dd7-8ee0-c989699407b0\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**6.** `mp` **— количество процессов, запущенных определенного числа.**\n\nЗапустим команду ps с модификатором h и флагом е для получения всех процессов без строки заголовка. Чтобы выбрать только даты, добавим аргументы -o lstart и -D %d.%m.%y. Теперь для поиска и подсчёта можно вводить дату в привычном формате.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/04004433-fdc6-4f69-b583-bde2f57b3f65\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**7.** `tu` **— посчитать количество терминалов, с которых запущены процессы в текущий момент времени.**\n\nКоманда who в числе прочих данных выводит список активных терминалов. Подсчитаем их с помощью wc -l. При этом, поскольку с терминала pts/0 процессы не запускаются, отнимем от подсчитанного значения 1. Остаётся только вывести полученное арифметическое выражение с помощью echo.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/2892512e-de5f-4ef8-b6ae-a9c2f3f2b120\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**8.** `bp` **— вывести информацию об указанном количестве процессов, имеющих наибольшее время использования процессора.**\n\nВыведем список всех процессов командой ps -e. Также после аргумента -o укажем необходимые поля для вывода: пользователь, идентификатор процесса, процессорное время и команда. Чтобы отсортировать список по процессорному времени по убыванию используем аргумент --sort=-time. Чтобы вывести указанное количество строк из полученного списка, используем команду head. Аргумент -n задаёт число строк для вывода. Поскольку строка заголовка в данном случае нужна, к указанному числу прибавим 1.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/ce81da0f-5ae7-45e9-9052-2dea443de266\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**9.** `bf` **— вывести информацию об указанном количестве файлов, имеющих наибольший размер.**\n\nС помощью флага -S отсортируем вывод команды ls -lh по размеру файлов. Чтобы отобрать файлы из содержимого каталога, применим grep ‘^-‘. Чтобы выбрать только указанное количество файлов из топа, используем head -n $2.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/31071b65-2a57-4a34-91df-e17a68bd50e3\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**10.** `fm` **— посчитать кол-во директорий в указанном каталоге, у которых права доступа: rwxrwxrwx.**\n\nВыведем содержимое указанного каталога, после чего используем grep с шаблоном ‘^drwxrwxrwx’ (выбирает директории с полной триадой прав) и подсчитаем с помощью флага -c.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/eacb8836-a9bd-4c5b-aa4d-fe512c14ecb8\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**11.** `ml` **— вывести информацию об указанном количестве файлов, имеющих наибольшее число связей.**\n\nЧисло связей файлов выводится во втором столбце вывода команды ls -l. Поэтому, чтобы отсортировать файлы и директории по числу связей, передадим команде sort аргументы -rnk2 (числовая сортировка по убыванию по второму столбцу). Чтобы получить указанное количество файлов, применим команду head.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/58868b27-3d00-40bf-8a5e-43ffe5370d5f\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**12.** `ll` **— список пользователей-владельцев файлов в указанном каталоге.**\n\nЧтобы вычленить пользователей владельцев из содержимого каталога, применим команду awk. Чтобы выбрать из них уникальные имена, используем sort -u.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/703ea097-8f69-4cfb-9571-124b732f6f69\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**13.** `rl` **— вывести список всех файлов, с датой создания, равной текущему числу.**\n\nДля вывода содержимого каталога с датой создания применим аргумент --time=creation, а чтобы эта дата была в более привычном формате, добавим аргумент --time-style +%d.%m.%y. Текущую дату получим в этом же формате командой date. Остаётся только найти строчки, содержащие эту дату (а также - в начале строки как признак файла), при помощи grep.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/12b33de6-019e-40c5-9cb6-f5a56f0c2f44\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**14.** `lr` **— вывести 5 последних процессов, запущенных root.**\n\nПо аналогии с командой bp (см. пункт 8) выведем интересующие нас колонки процессов root и с помощью аргумента --sort=-start отсортируем по времени создания по убыванию.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/5d401952-37ac-46b1-9795-cd9bb2d31f1c\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**15.** `rc` **— вывести 5 процессов, запущенных studentom.**\n\nВыведем все процессы, запущенные указанным пользователем, после чего выберем 5 из них (а также строку заголовка).\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/a0c9883f-a80f-4922-8a18-7f8c8e2f1d0f\" /\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**16.** `cu` **— посчитать, какое количество пользователей сейчас работает в системе (имя уникально).**\n\nВыведем работающих на данный момент пользователей командой w, отбросим строку заголовка флагом -h и подсчитаем оставшиеся строки пользователей.\n\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/577b7673-b0ee-493d-86a7-7a71f1516070\" /\u003e\n\n\u003c/details\u003e\n\n\u003ch2\u003eСложные скрипты\u003c/h2\u003e\n\u003ch3\u003eЗадание\u003c/h3\u003e\nРазработать программу-скрипт средствами Shell. Программа должна запускаться в следующем формате: `./script.sh Time NumItem ItemFile`, где:\n \n- Тime — длительность промежутка времени;\n- Numltem — количество пунктов меню;\n- ItemFile — текстовый файл с наименованием пунктов меню.\n\nСкрипт должен выполнять следующие действия:\n1. При запуске контролировать наличие необходимых параметров и при необходимости выдавать сообщение об ошибке.\n2. Выводить сообщение-подсказку о выполняемом задании.\n3. Формировать меню с требуемым количеством пунктов. Информация о названии пунктов берется из текстового конфигурационного файла.\n4. Реализовывать выполнение пунктов меню в соответствии с индивидуальным заданием.\n5. Для периодических действий период повтора брать из параметра Time.\n6. Результаты выполнения должны выводится на экран в формате:\n```\n----------------------------Дата---Время----------------------------\n                             Результаты\n--------------------------------------------------------------------\n```\n7. Предусмотреть выход из скрипта по заданному условию и возврат в главное меню программы.\n8. При необходимости параметры работы скрипта могут вводится в диалоговом режиме.\n9. Все действия, производимые скриптом фиксировать в файле журнала.\n\n\u003ch3\u003eЗапуск\u003c/h3\u003e\nДля запуска скрипта нужного варианта выполните следующие команды из корня репозитория:\n\n```shell\nLAB_VARIANT=\u003cНОМЕР_ВАРИАНТА\u003e\nchmod +x complex/$LAB_VARIANT/main.sh\n./complex/$LAB_VARIANT/main.sh\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch3\u003eСкрипты\u003c/h3\u003e\u003c/summary\u003e\n\n**[Вариант 5](./complex/5)**\n1. Поиск в двух указанных каталогах файлов с одинаковым содержимым. Вывод имен этих файлов и размера в строках.\n2. Создание в текущем каталоге папки вида data-time до тех пор, пока в текущем каталоге не появится файл с именем stop. В каждую папку копировать из текущего каталога файлы, заканчивающиеся на символы а — в первую папку, b — во вторую папку и т. д.\n3. При выходе удаление всех созданных папок и создание файла, в который записывается их количество.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch4\u003eСкриншоты\u003c/h4\u003e\u003c/summary\u003e\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/a117e026-032d-4684-b56b-d35195969c2f\" /\u003e\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/da8dcbcb-3262-4e9e-af61-1a228592e3d4\" /\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch4\u003eПример лога\u003c/h4\u003e\u003c/summary\u003e\n\n```\n[\u003cДАТА И ВРЕМЯ\u003e] \u003cВЫЗОВ ФУНКЦИИ ИЛИ ФАЙЛА С АРГУМЕНТАМИ\u003e\n\u003cСООБЩЕНИЕ\u003e\n\n\n[28.10.2023 22:05:53] \u003cодна из библиотек\u003e\nСоздаём файл лога\n\n[28.10.2023 22:05:53] \u003cодна из библиотек\u003e\nНайдено 3 запрограммированных действий по варианту: sizeDifference analyzeProcessCountChanging listNewProcesses\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПроверим аргументы скрипта на корректность\n\n[28.10.2023 22:05:53] isIntBetween \"3\" \"длительность промежутка времени в секундах\" \"1\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:05:53]\nПроверим, лежит ли 3 между min=1 и max=\n\n[28.10.2023 22:05:53] isIntBetween \"3\" \"максимальное количество пунктов меню\" \"3\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:05:53]\nПроверим, лежит ли 3 между min=3 и max=\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПроверим, доступен ли файл \"menu\" для чтения\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПервоначальная настройка завершена, переходим в основной цикл\n\n[28.10.2023 22:05:53] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:05:53] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:05:53]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:05:53] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:05:53] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:05:59]\nСчитан символ '1'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:05:59] isIntBetween \"1\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"1\" числовым значением\n[28.10.2023 22:05:59]\nПроверим, лежит ли 1 между min=1 и max=3\n\n[28.10.2023 22:05:59] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:05:59] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:05:59] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:05:59] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"sizeDifference\"\n\n[28.10.2023 22:05:59] sizeDifference\nСчитаем папку для проверки\n\n[28.10.2023 22:05:59] readTillCorrectResult \"_readDirectory\" \"папку для поиска файлов по подкаталогам\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:06:07] _readDirectory\nСчитано значение \"/home/scorpion\". Проверим, папка ли это\n[28.10.2023 22:06:07]\nТеперь проверим, содержит ли она подкаталоги для проверки\n\n[28.10.2023 22:06:07] readTillCorrectResult \"_readDirectory\" \"папку для поиска файлов по подкаталогам\"\nСчитывание прошло успешно\n\n[28.10.2023 22:06:07] sizeDifference\nНайдём подкаталоги 1-го уровня данной папки\n[28.10.2023 22:06:07]\nНачинаем просмотр каждого из них\n[28.10.2023 22:06:07]\n\".config\": 112510389 - 0 = 112510389\n[28.10.2023 22:06:07]\n\".local\": 127916928 - 0 = 127916928\n[28.10.2023 22:06:07]\n\".cache\": 255842149 - 0 = 255842149\n[28.10.2023 22:06:07]\n\"Desktop\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\".yandex\": 580 - 38 = 542\n[28.10.2023 22:06:07]\n\".pki\": 36864 - 449 = 36415\n[28.10.2023 22:06:07]\n\".vscode\": 119869456 - 0 = 119869456\n[28.10.2023 22:06:07]\n\".gnome\": 354 - 326 = 28\n[28.10.2023 22:06:07]\n\".designer\": 16718 - 848 = 15870\n[28.10.2023 22:06:07]\n\".cargo\": 239662666 - 0 = 239662666\n[28.10.2023 22:06:07]\n\".java\": 148572 - 0 = 148572\n[28.10.2023 22:06:07]\n\".android\": 1704 - 12 = 1692\n[28.10.2023 22:06:07]\n\".jdks\": 130326280 - 11 = 130326269\n[28.10.2023 22:06:07]\n\".m2\": 575854 - 40 = 575814\n[28.10.2023 22:06:07]\n\".pgadmin\": 61440 - 0 = 61440\n[28.10.2023 22:06:07]\n\".swt\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Загрузки\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Документы\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Изображения\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Видео\" — содержит менее двух файлов, невозможно получить разность\n\n[28.10.2023 22:06:07] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"sizeDifference\" завершено\n\n[28.10.2023 22:06:07] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:06:07] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:06:07]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:06:07] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:06:07] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:07:02]\nСчитан символ '2'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:07:02] isIntBetween \"2\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"2\" числовым значением\n[28.10.2023 22:07:02]\nПроверим, лежит ли 2 между min=1 и max=3\n\n[28.10.2023 22:07:02] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:07:02] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:02] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:07:02] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"analyzeProcessCountChanging\"\n\n[28.10.2023 22:07:02] analyzeProcessCountChanging\nСчитаем пользователя и предел процессов\n\n[28.10.2023 22:07:02] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:07:06] _readUser\nСчитано значение \"noname\". Проверим, пользователь ли это\n[28.10.2023 22:07:06]\nНет, такого пользователя не существует\n\n[28.10.2023 22:07:06] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nФункция считывания завершилась с ошибкой, запускаем ещё раз\n\n[28.10.2023 22:07:12] _readUser\nСчитано значение \"scorpion\". Проверим, пользователь ли это\n\n[28.10.2023 22:07:12] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:12] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:07:15] _readProcessLimit\nСчитано значение \"0\". Проверим, положительное ли это число\n\n[28.10.2023 22:07:15] isIntBetween \"0\" \"предел процессов\" \"1\"\nПроверим, является ли \"0\" числовым значением\n[28.10.2023 22:07:15]\nПроверим, лежит ли 0 между min=1 и max=\n[28.10.2023 22:07:15]\nНет, не лежит\n\n[28.10.2023 22:07:15] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nФункция считывания завершилась с ошибкой, запускаем ещё раз\n\n[28.10.2023 22:07:28] _readProcessLimit\nСчитано значение \"160\". Проверим, положительное ли это число\n\n[28.10.2023 22:07:28] isIntBetween \"160\" \"предел процессов\" \"1\"\nПроверим, является ли \"160\" числовым значением\n[28.10.2023 22:07:28]\nПроверим, лежит ли 160 между min=1 и max=\n\n[28.10.2023 22:07:28] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:28] analyzeProcessCountChanging\nНачинаем проверку числа процессов пользователя scorpion с интервалом 3 секунд\n\n[28.10.2023 22:07:28] analyzeProcessCountChanging\nНайдено 100 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:28] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 100, а максимальное значение 160\n[28.10.2023 22:07:28]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:28] _divAndRound \"1000\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:28]\nРазделив делимое 1000 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:28]\nРазделим делимое 1000 на делитель 160 с остатком, получаем 40\n[28.10.2023 22:07:28]\nРазделим остаток 40, умноженный на 10, на делитель 160 нацело, получаем 2 — разряд десятых частного\n[28.10.2023 22:07:28]\nОкругляя частное 6,2 до целых, разряд десятых отбрасываем, поскольку 2 \u003c 5\n[28.10.2023 22:07:28]\nДобавим незаполненную часть из 4 ячеек в прогрессбар\n[28.10.2023 22:07:28]\nДобавим заполненную часть из 6 ячеек в начало прогрессбара.\n[28.10.2023 22:07:28]\nИтоговый прогрессбар: ******————\n\n[28.10.2023 22:07:31] analyzeProcessCountChanging\nНайдено 100 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:31] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 100, а максимальное значение 160\n[28.10.2023 22:07:31]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:31] _divAndRound \"1000\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:31]\nРазделив делимое 1000 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:31]\nРазделим делимое 1000 на делитель 160 с остатком, получаем 40\n[28.10.2023 22:07:31]\nРазделим остаток 40, умноженный на 10, на делитель 160 нацело, получаем 2 — разряд десятых частного\n[28.10.2023 22:07:31]\nОкругляя частное 6,2 до целых, разряд десятых отбрасываем, поскольку 2 \u003c 5\n[28.10.2023 22:07:31]\nДобавим незаполненную часть из 4 ячеек в прогрессбар\n[28.10.2023 22:07:31]\nДобавим заполненную часть из 6 ячеек в начало прогрессбара.\n[28.10.2023 22:07:31]\nИтоговый прогрессбар: ******————\n\n[28.10.2023 22:07:34] analyzeProcessCountChanging\nНайдено 104 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:34] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 104, а максимальное значение 160\n[28.10.2023 22:07:34]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:34] _divAndRound \"1040\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:34]\nРазделив делимое 1040 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:34]\nРазделим делимое 1040 на делитель 160 с остатком, получаем 80\n[28.10.2023 22:07:34]\nРазделим остаток 80, умноженный на 10, на делитель 160 нацело, получаем 5 — разряд десятых частного\n[28.10.2023 22:07:34]\nОкругляя частное 6,5 до целых, увеличиваем целую часть на 1, поскольку 5 ≥ 5\n[28.10.2023 22:07:34]\nДобавим незаполненную часть из 3 ячеек в прогрессбар\n[28.10.2023 22:07:34]\nДобавим заполненную часть из 7 ячеек в начало прогрессбара.\n[28.10.2023 22:07:34]\nИтоговый прогрессбар: *******———\n\n[28.10.2023 22:07:37] analyzeProcessCountChanging\nНайдено 126 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:37] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 126, а максимальное значение 160\n[28.10.2023 22:07:37]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:37] _divAndRound \"1260\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:37]\nРазделив делимое 1260 на делитель 160 нацело, получаем 7\n[28.10.2023 22:07:37]\nРазделим делимое 1260 на делитель 160 с остатком, получаем 140\n[28.10.2023 22:07:37]\nРазделим остаток 140, умноженный на 10, на делитель 160 нацело, получаем 8 — разряд десятых частного\n[28.10.2023 22:07:37]\nОкругляя частное 7,8 до целых, увеличиваем целую часть на 1, поскольку 8 ≥ 5\n[28.10.2023 22:07:37]\nДобавим незаполненную часть из 2 ячеек в прогрессбар\n[28.10.2023 22:07:37]\nДобавим заполненную часть из 8 ячеек в начало прогрессбара.\n[28.10.2023 22:07:37]\nИтоговый прогрессбар: ********——\n\n[28.10.2023 22:07:40] analyzeProcessCountChanging\nНайдено 146 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:40] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 146, а максимальное значение 160\n[28.10.2023 22:07:40]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:40] _divAndRound \"1460\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:40]\nРазделив делимое 1460 на делитель 160 нацело, получаем 9\n[28.10.2023 22:07:40]\nРазделим делимое 1460 на делитель 160 с остатком, получаем 20\n[28.10.2023 22:07:40]\nРазделим остаток 20, умноженный на 10, на делитель 160 нацело, получаем 1 — разряд десятых частного\n[28.10.2023 22:07:40]\nОкругляя частное 9,1 до целых, разряд десятых отбрасываем, поскольку 1 \u003c 5\n[28.10.2023 22:07:40]\nДобавим незаполненную часть из 1 ячеек в прогрессбар\n[28.10.2023 22:07:40]\nДобавим заполненную часть из 9 ячеек в начало прогрессбара.\n[28.10.2023 22:07:40]\nИтоговый прогрессбар: *********—\n\n[28.10.2023 22:07:43] analyzeProcessCountChanging\nНайдено 166 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:43] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 166, а максимальное значение 160\n[28.10.2023 22:07:43]\nТекущее значение не меньше, чем максимальное. Значит, он будет заполнен полностью\n[28.10.2023 22:07:43]\nТекущее значение превышает максимальное. Добавим в прогрессбар символ '\u003e', свидетельствующий об этом\n[28.10.2023 22:07:43]\nДобавим заполненную часть из 10 ячеек в начало прогрессбара.\n[28.10.2023 22:07:43]\nИтоговый прогрессбар: **********\u003e\n\n[28.10.2023 22:07:46] analyzeProcessCountChanging\nПредел числа процессов (160) достигнут\n\n[28.10.2023 22:07:46] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"analyzeProcessCountChanging\" завершено\n\n[28.10.2023 22:07:46] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:07:46] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:07:46]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:07:46] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:07:46] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:08:09]\nСчитан символ '3'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:08:09] isIntBetween \"3\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:08:09]\nПроверим, лежит ли 3 между min=1 и max=3\n\n[28.10.2023 22:08:09] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:08:09] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:08:09] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:08:09] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"listNewProcesses\"\n\n[28.10.2023 22:08:09] listNewProcesses\nПолучаем общий список процессов\n\n[28.10.2023 22:08:09] listNewProcesses\nВыводим только те процессы из списка, которые появились после запуска скрипта (PID которого 216862)\n\n[28.10.2023 22:08:09] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"listNewProcesses\" завершено\n\n[28.10.2023 22:08:09] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:08:09] ./main.sh\nВыходим из основного цикла\n```\n\n\u003c/details\u003e\n\n**[Вариант 9](./complex/9)**\n1. Определить разность между максимальным и минимальным размерами файлов во всех подкаталогах указанного каталога.\n2. Анализировать изменение количества процессов запущенных указанным пользователем в системе. Результат выводить в виде диаграммы вида:\n```\n****    4 процесса\n**      2 процесса\n******  6 процессов\n***     3 процесса\n*       1 процесс\n*       1 процесс\n**      2 процесса\n```\nи т. д. В начале каждой строки выводить текущее время.\n\nВыход при превышении количества процессов некоторой заданной границы.\n\n3. При выходе из программы формирование списка процессов, появившихся в системе за время работы скрипта.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch4\u003eСкриншоты\u003c/h4\u003e\u003c/summary\u003e\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/b07be7ee-f908-424e-8cea-293931739083\" /\u003e\n\u003cimg width=75% src=\"https://github.com/user-attachments/assets/97c79fba-9a9d-4797-922c-33cf5a0169b4\" /\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch4\u003eПример лога\u003c/h4\u003e\u003c/summary\u003e\n\n```\n[\u003cДАТА И ВРЕМЯ\u003e] \u003cВЫЗОВ ФУНКЦИИ ИЛИ ФАЙЛА С АРГУМЕНТАМИ\u003e\n\u003cСООБЩЕНИЕ\u003e\n\n\n[28.10.2023 22:05:53] \u003cодна из библиотек\u003e\nСоздаём файл лога\n\n[28.10.2023 22:05:53] \u003cодна из библиотек\u003e\nНайдено 3 запрограммированных действий по варианту: sizeDifference analyzeProcessCountChanging listNewProcesses\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПроверим аргументы скрипта на корректность\n\n[28.10.2023 22:05:53] isIntBetween \"3\" \"длительность промежутка времени в секундах\" \"1\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:05:53]\nПроверим, лежит ли 3 между min=1 и max=\n\n[28.10.2023 22:05:53] isIntBetween \"3\" \"максимальное количество пунктов меню\" \"3\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:05:53]\nПроверим, лежит ли 3 между min=3 и max=\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПроверим, доступен ли файл \"menu\" для чтения\n\n[28.10.2023 22:05:53] ./main.sh \"3\" \"3\" \"menu\"\nПервоначальная настройка завершена, переходим в основной цикл\n\n[28.10.2023 22:05:53] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:05:53] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:05:53]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:05:53] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:05:53] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:05:59]\nСчитан символ '1'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:05:59] isIntBetween \"1\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"1\" числовым значением\n[28.10.2023 22:05:59]\nПроверим, лежит ли 1 между min=1 и max=3\n\n[28.10.2023 22:05:59] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:05:59] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:05:59] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:05:59] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"sizeDifference\"\n\n[28.10.2023 22:05:59] sizeDifference\nСчитаем папку для проверки\n\n[28.10.2023 22:05:59] readTillCorrectResult \"_readDirectory\" \"папку для поиска файлов по подкаталогам\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:06:07] _readDirectory\nСчитано значение \"/home/scorpion\". Проверим, папка ли это\n[28.10.2023 22:06:07]\nТеперь проверим, содержит ли она подкаталоги для проверки\n\n[28.10.2023 22:06:07] readTillCorrectResult \"_readDirectory\" \"папку для поиска файлов по подкаталогам\"\nСчитывание прошло успешно\n\n[28.10.2023 22:06:07] sizeDifference\nНайдём подкаталоги 1-го уровня данной папки\n[28.10.2023 22:06:07]\nНачинаем просмотр каждого из них\n[28.10.2023 22:06:07]\n\".config\": 112510389 - 0 = 112510389\n[28.10.2023 22:06:07]\n\".local\": 127916928 - 0 = 127916928\n[28.10.2023 22:06:07]\n\".cache\": 255842149 - 0 = 255842149\n[28.10.2023 22:06:07]\n\"Desktop\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\".yandex\": 580 - 38 = 542\n[28.10.2023 22:06:07]\n\".pki\": 36864 - 449 = 36415\n[28.10.2023 22:06:07]\n\".vscode\": 119869456 - 0 = 119869456\n[28.10.2023 22:06:07]\n\".gnome\": 354 - 326 = 28\n[28.10.2023 22:06:07]\n\".designer\": 16718 - 848 = 15870\n[28.10.2023 22:06:07]\n\".cargo\": 239662666 - 0 = 239662666\n[28.10.2023 22:06:07]\n\".java\": 148572 - 0 = 148572\n[28.10.2023 22:06:07]\n\".android\": 1704 - 12 = 1692\n[28.10.2023 22:06:07]\n\".jdks\": 130326280 - 11 = 130326269\n[28.10.2023 22:06:07]\n\".m2\": 575854 - 40 = 575814\n[28.10.2023 22:06:07]\n\".pgadmin\": 61440 - 0 = 61440\n[28.10.2023 22:06:07]\n\".swt\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Загрузки\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Документы\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Изображения\" — содержит менее двух файлов, невозможно получить разность\n[28.10.2023 22:06:07]\n\"Видео\" — содержит менее двух файлов, невозможно получить разность\n\n[28.10.2023 22:06:07] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"sizeDifference\" завершено\n\n[28.10.2023 22:06:07] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:06:07] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:06:07]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:06:07] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:06:07] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:07:02]\nСчитан символ '2'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:07:02] isIntBetween \"2\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"2\" числовым значением\n[28.10.2023 22:07:02]\nПроверим, лежит ли 2 между min=1 и max=3\n\n[28.10.2023 22:07:02] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:07:02] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:02] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:07:02] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"analyzeProcessCountChanging\"\n\n[28.10.2023 22:07:02] analyzeProcessCountChanging\nСчитаем пользователя и предел процессов\n\n[28.10.2023 22:07:02] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:07:06] _readUser\nСчитано значение \"noname\". Проверим, пользователь ли это\n[28.10.2023 22:07:06]\nНет, такого пользователя не существует\n\n[28.10.2023 22:07:06] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nФункция считывания завершилась с ошибкой, запускаем ещё раз\n\n[28.10.2023 22:07:12] _readUser\nСчитано значение \"scorpion\". Проверим, пользователь ли это\n\n[28.10.2023 22:07:12] readTillCorrectResult \"_readUser\" \"имя пользователя, процессы которого нужно сканировать\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:12] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n\n[28.10.2023 22:07:15] _readProcessLimit\nСчитано значение \"0\". Проверим, положительное ли это число\n\n[28.10.2023 22:07:15] isIntBetween \"0\" \"предел процессов\" \"1\"\nПроверим, является ли \"0\" числовым значением\n[28.10.2023 22:07:15]\nПроверим, лежит ли 0 между min=1 и max=\n[28.10.2023 22:07:15]\nНет, не лежит\n\n[28.10.2023 22:07:15] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nФункция считывания завершилась с ошибкой, запускаем ещё раз\n\n[28.10.2023 22:07:28] _readProcessLimit\nСчитано значение \"160\". Проверим, положительное ли это число\n\n[28.10.2023 22:07:28] isIntBetween \"160\" \"предел процессов\" \"1\"\nПроверим, является ли \"160\" числовым значением\n[28.10.2023 22:07:28]\nПроверим, лежит ли 160 между min=1 и max=\n\n[28.10.2023 22:07:28] readTillCorrectResult \"_readProcessLimit\" \"предел процессов, при достижении которого необходимо прервать сканирование\"\nСчитывание прошло успешно\n\n[28.10.2023 22:07:28] analyzeProcessCountChanging\nНачинаем проверку числа процессов пользователя scorpion с интервалом 3 секунд\n\n[28.10.2023 22:07:28] analyzeProcessCountChanging\nНайдено 100 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:28] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 100, а максимальное значение 160\n[28.10.2023 22:07:28]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:28] _divAndRound \"1000\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:28]\nРазделив делимое 1000 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:28]\nРазделим делимое 1000 на делитель 160 с остатком, получаем 40\n[28.10.2023 22:07:28]\nРазделим остаток 40, умноженный на 10, на делитель 160 нацело, получаем 2 — разряд десятых частного\n[28.10.2023 22:07:28]\nОкругляя частное 6,2 до целых, разряд десятых отбрасываем, поскольку 2 \u003c 5\n[28.10.2023 22:07:28]\nДобавим незаполненную часть из 4 ячеек в прогрессбар\n[28.10.2023 22:07:28]\nДобавим заполненную часть из 6 ячеек в начало прогрессбара.\n[28.10.2023 22:07:28]\nИтоговый прогрессбар: ******————\n\n[28.10.2023 22:07:31] analyzeProcessCountChanging\nНайдено 100 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:31] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 100, а максимальное значение 160\n[28.10.2023 22:07:31]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:31] _divAndRound \"1000\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:31]\nРазделив делимое 1000 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:31]\nРазделим делимое 1000 на делитель 160 с остатком, получаем 40\n[28.10.2023 22:07:31]\nРазделим остаток 40, умноженный на 10, на делитель 160 нацело, получаем 2 — разряд десятых частного\n[28.10.2023 22:07:31]\nОкругляя частное 6,2 до целых, разряд десятых отбрасываем, поскольку 2 \u003c 5\n[28.10.2023 22:07:31]\nДобавим незаполненную часть из 4 ячеек в прогрессбар\n[28.10.2023 22:07:31]\nДобавим заполненную часть из 6 ячеек в начало прогрессбара.\n[28.10.2023 22:07:31]\nИтоговый прогрессбар: ******————\n\n[28.10.2023 22:07:34] analyzeProcessCountChanging\nНайдено 104 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:34] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 104, а максимальное значение 160\n[28.10.2023 22:07:34]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:34] _divAndRound \"1040\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:34]\nРазделив делимое 1040 на делитель 160 нацело, получаем 6\n[28.10.2023 22:07:34]\nРазделим делимое 1040 на делитель 160 с остатком, получаем 80\n[28.10.2023 22:07:34]\nРазделим остаток 80, умноженный на 10, на делитель 160 нацело, получаем 5 — разряд десятых частного\n[28.10.2023 22:07:34]\nОкругляя частное 6,5 до целых, увеличиваем целую часть на 1, поскольку 5 ≥ 5\n[28.10.2023 22:07:34]\nДобавим незаполненную часть из 3 ячеек в прогрессбар\n[28.10.2023 22:07:34]\nДобавим заполненную часть из 7 ячеек в начало прогрессбара.\n[28.10.2023 22:07:34]\nИтоговый прогрессбар: *******———\n\n[28.10.2023 22:07:37] analyzeProcessCountChanging\nНайдено 126 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:37] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 126, а максимальное значение 160\n[28.10.2023 22:07:37]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:37] _divAndRound \"1260\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:37]\nРазделив делимое 1260 на делитель 160 нацело, получаем 7\n[28.10.2023 22:07:37]\nРазделим делимое 1260 на делитель 160 с остатком, получаем 140\n[28.10.2023 22:07:37]\nРазделим остаток 140, умноженный на 10, на делитель 160 нацело, получаем 8 — разряд десятых частного\n[28.10.2023 22:07:37]\nОкругляя частное 7,8 до целых, увеличиваем целую часть на 1, поскольку 8 ≥ 5\n[28.10.2023 22:07:37]\nДобавим незаполненную часть из 2 ячеек в прогрессбар\n[28.10.2023 22:07:37]\nДобавим заполненную часть из 8 ячеек в начало прогрессбара.\n[28.10.2023 22:07:37]\nИтоговый прогрессбар: ********——\n\n[28.10.2023 22:07:40] analyzeProcessCountChanging\nНайдено 146 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:40] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 146, а максимальное значение 160\n[28.10.2023 22:07:40]\nТекущее значение меньше, чем максимальное. Умножим текущее значение на 10 и поделим на максимальное с учётом округления количества ячеек\n\n[28.10.2023 22:07:40] _divAndRound \"1460\" \"160\"\nПроизведём деление до десятых с округлением до целых\n[28.10.2023 22:07:40]\nРазделив делимое 1460 на делитель 160 нацело, получаем 9\n[28.10.2023 22:07:40]\nРазделим делимое 1460 на делитель 160 с остатком, получаем 20\n[28.10.2023 22:07:40]\nРазделим остаток 20, умноженный на 10, на делитель 160 нацело, получаем 1 — разряд десятых частного\n[28.10.2023 22:07:40]\nОкругляя частное 9,1 до целых, разряд десятых отбрасываем, поскольку 1 \u003c 5\n[28.10.2023 22:07:40]\nДобавим незаполненную часть из 1 ячеек в прогрессбар\n[28.10.2023 22:07:40]\nДобавим заполненную часть из 9 ячеек в начало прогрессбара.\n[28.10.2023 22:07:40]\nИтоговый прогрессбар: *********—\n\n[28.10.2023 22:07:43] analyzeProcessCountChanging\nНайдено 166 процессов. Выведем требуемую информацию о них\n\n[28.10.2023 22:07:43] getProgressBar\nПолучим прогрессбар длиной в 10 ячеек, имея текущее значение 166, а максимальное значение 160\n[28.10.2023 22:07:43]\nТекущее значение не меньше, чем максимальное. Значит, он будет заполнен полностью\n[28.10.2023 22:07:43]\nТекущее значение превышает максимальное. Добавим в прогрессбар символ '\u003e', свидетельствующий об этом\n[28.10.2023 22:07:43]\nДобавим заполненную часть из 10 ячеек в начало прогрессбара.\n[28.10.2023 22:07:43]\nИтоговый прогрессбар: **********\u003e\n\n[28.10.2023 22:07:46] analyzeProcessCountChanging\nПредел числа процессов (160) достигнут\n\n[28.10.2023 22:07:46] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"analyzeProcessCountChanging\" завершено\n\n[28.10.2023 22:07:46] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:07:46] _menuItems\nПрочитаем и выведем 3 строк файла \"menu\"\n[28.10.2023 22:07:46]\nВыведено 3 пунктов меню\n\n[28.10.2023 22:07:46] ./main.sh\nСчитаем символ для выбора пункта меню\n\n[28.10.2023 22:07:46] readTillCorrectResult \"_readNum\" \"пункт меню\"\nБудем запускать функцию считывания, пока она не завершится без ошибок\n[28.10.2023 22:08:09]\nСчитан символ '3'. Проверим, является ли он номером одного из пунктов меню\n\n[28.10.2023 22:08:09] isIntBetween \"3\" \"пункт меню\" \"1\" \"3\"\nПроверим, является ли \"3\" числовым значением\n[28.10.2023 22:08:09]\nПроверим, лежит ли 3 между min=1 и max=3\n\n[28.10.2023 22:08:09] _readNum\nСделаем пункт меню индексом (уменьшим на 1), чтобы обращаться по нему к массиву действий\n\n[28.10.2023 22:08:09] readTillCorrectResult \"_readNum\" \"пункт меню\"\nСчитывание прошло успешно\n\n[28.10.2023 22:08:09] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:08:09] ./main.sh \"3\" \"3\" \"menu\"\nНачинаем выполнение действия \"listNewProcesses\"\n\n[28.10.2023 22:08:09] listNewProcesses\nПолучаем общий список процессов\n\n[28.10.2023 22:08:09] listNewProcesses\nВыводим только те процессы из списка, которые появились после запуска скрипта (PID которого 216862)\n\n[28.10.2023 22:08:09] ./main.sh \"3\" \"3\" \"menu\"\nДействие \"listNewProcesses\" завершено\n\n[28.10.2023 22:08:09] border\nВыводим строчку с текущей датой и временем\n\n[28.10.2023 22:08:09] ./main.sh\nВыходим из основного цикла\n```\n\u003c/details\u003e\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscorpi-on%2Flinux-shell-labs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscorpi-on%2Flinux-shell-labs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscorpi-on%2Flinux-shell-labs/lists"}