--- title: Linux Bash Справочник source: https://www.glukhov.org/ru/post/2024/04/bash-cheat-sheet/ author: - "[[Рост Глухов | Персональный сайт и технический блог]]" published: 2024-04-18 created: 2025-08-23 description: "Bash: Справочник" tags: - clippings - "#linux" - "#bash" --- Не очень подробный список, просто несколько полезных для меня пунктов ![bash и shell день рождения!](https://www.glukhov.org/post/2024/04/bash-cheat-sheet/bash-n-shell-678.jpg "bash потрясающий!") ## Проверка версии Linux Ubuntu Метод 1 ```bash lsb_release -a ``` выдаст что-то вроде ```bash Нет доступных модулей LSB. Идентификатор дистрибутива: Linuxmint Описание: Linux Mint 22.1 Версия: 22.1 Кодовое имя: xia ``` Метод 2 ```bash cat /etc/os-release ``` выдаст что-то вроде ```bash NAME="Linux Mint" VERSION="22.1 (Xia)" ID=linuxmint ID_LIKE="ubuntu debian" PRETTY_NAME="Linux Mint 22.1" VERSION_ID="22.1" HOME_URL="https://www.linuxmint.com/" SUPPORT_URL="https://forums.linuxmint.com/" BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/" PRIVACY_POLICY_URL="https://www.linuxmint.com/" VERSION_CODENAME=xia UBUNTU_CODENAME=noble ``` ## Архивирование и распаковка Сжатие ```bash tar -zcvf archive-name.tgz directory-name ``` Распаковка ```bash tar -zxvf archive-name.tgz ``` ## Удалённые серверы Передача идентификатора пользователя на удалённый сервер ```bash ssh-copy-id user@10.0.0.225 ``` Это позволит войти без пароля в следующий раз, например: ```bash ssh user@10.0.0.225 ``` Загрузка файла ```bash scp ~/file.ext user@host-ip:/home/user/file.ext ``` Загрузка папки с вложенными элементами рекурсивно ```bash scp -r user@host-ip:/home/user/dir ~/dir ``` ## Папки и файлы Проверка на существование ```bash # создать папку, если она не существует, со всеми промежуточными папками [ -d $repdir ] || mkdir -p $repdir # или if [ -d $fname ]; then echo "Файл не существует: $fname" return fi ``` Создание папки для определённого пользователя ```bash sudo mkdir dir1 sudo chown specific_user dir1 sudo chown :specific_group dir1 ``` Итерация по файлам в папке ```bash # этот пример конвертирует все jpg файлы в некоторой папке в fits for f in some-folder/*.jpg do convert "$f" "${f/.jpg/.fits}" done ``` Объединение всех файлов в один ```bash cat ./* > merged.txt ``` ## Добавление выполнения команды в crontab ```bash (crontab -l 2>/dev/null | \ grep -v control-marker-1; \ echo '*/15 * * * * /bin/bash /home/user/stest/stest.sh /home/user/stest >> /home/user/stest/stest.log 2>&1 #control-marker-1') | \ crontab - ``` здесь: - \*/15 - выполняется каждые 15 минут - control-marker-1 - идентификатор этой команды в конфигурации cron для обновления её в следующий раз с тем же скриптом - /bin/bash - команда для выполнения - /home/user/stest/stest.sh - параметр bash - bash выполнит этот скрипт - /home/user/stest - параметр скрипта - будет доступен как $1 - /home/user/stest/stest.log - файл журнала с выводом консоли stest.sh Проверка ```bash grep /home/user/stest/stest.sh /var/log/syslog crontab -e ``` ## Журналы Просмотр журнала в режиме реального времени ```bash sudo tail -f /var/log/megalog.log ``` ## Код состояния curl ```bash response=$(curl --write-out '%{http_code}' --silent --output /dev/null servername) # или url='http://localhost:8080/' status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url}) [[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # выполнить логику запуска/перезапуска ``` ## Оставить команду ssh работающей после выхода [https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh](https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh) Предположим, у вас запущена программа в переднем плане, нажмите - ctrl-Z, затем: \[1\]+ Остановлено myprogram - disown -h %1 - bg 1 \[1\]+ myprogram & - logout ## Генерация JSON Установите jo ```bash sudo apt-get install jo ``` ```bash a="123" b="45语 jo "model=a" "prompt=b" "stream=false" ``` выдаст ```bash {"model":"a", "prompt":"b", "stream":false} ``` Сlightly более сложный пример: ```bash jo -p name=Jane point[]=1 point[]=2 geo[lat]=10 geo[lon]=20 { "name": "Jane", "point": [ 1, 2 ], "geo": { "lat": 10, "lon": 20 } } ``` ## Форматирование JSON Используйте ```bash | jq . ``` Для форматирования JSON, созданного выше: ```bash a="123" b="456" jo "model=$a" "prompt=$b" "stream=false" | jq . ``` Форматированный JSON будет: ```bash { "model": 123, "prompt": 456, "stream": false } ``` ## Парсинг JSON и возврат значения определённого поля Сначала установите jq ```bash sudo apt-get install jq ``` Используйте ```bash | jq -r '.fieldName' ``` Например, парсинг вывода вызова Ollama: ```bash curl http://localhost:11434/api/generate -d '{ "model": "llama3", "prompt": "Why is the sky blue?", "stream": false }' | jq -r '.response' ``` ## Подсчёт слов в файле Подсчёт слов: ```bash wc -w filename.txt ``` вернёт что-то вроде ```bash 261 filename.txt ``` Если вы хотите просто число, вы можете вырезать первое слово, которое является числом ```bash words=\`wc -w filename.txt | cut -f1 -d' '\` echo "$words слов" ``` Или используйте wc так: ```bash words=\`wc -w < filename.txt\` echo "$words слов" ``` ## Проверка, сколько места занимает директория на HDD ```bash du ~/dirname ``` ## Получение имени папки, в которой находится выполняемый скрипт ```bash SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) ``` ## Измерение времени выполнения скрипта Один из вариантов - использовать функцию time ```bash time your_script.sh ``` Другой способ немного сложнее: ```bash start=\`date +%s\` # очень важный код # здесь end=\`date +%s\` runtime=$((end-start)) ``` ## Сравнение двух файлов с помощью VS Code ```bash code -d <файл 1> <файл 2> ``` ## Проверка доступных пакетов в репозитории Ubuntu ```bash sudo apt-cache policy ``` ## Полезные ссылки - [Справочник по Python](https://www.glukhov.org/ru/post/2024/08/python-cheat-sheet/) - [Справочник по Conda](https://www.glukhov.org/ru/post/2024/10/conda-cheatsheet/ "Справочник по Conda") - [Синхронизация закладок с Floccus](https://www.glukhov.org/ru/post/2024/08/sync-bookmarks-floccus/) - [Переустановка Linux](https://www.glukhov.org/ru/post/2024/04/reinstall-linux/) - [Справочник по Ollama](https://www.glukhov.org/ru/post/2024/12/ollama-cheatsheet/ "Справочник по Ollama") - [Справочник по Docker](https://www.glukhov.org/ru/post/2024/10/docker-cheatsheet/ "список и описание наиболее часто используемых и полезных команд Docker - справочник по Docker") - [Справочник по Kubernetes](https://www.glukhov.org/ru/post/2024/10/kubernetes-cheatsheet/ "список и описание наиболее часто используемых и полезных команд k8s - справочник по k8s") - [Справочник по Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Полный справочник по Markdown") - [Кодирование и декодирование Base64 в Windows, Linux и Mac](https://www.glukhov.org/ru/post/2025/04/base64/ "Справочник по кодированию/декодированию Base64 в Linux, Windows и Mac") - [Декодирование и вывод JWT токена](https://www.glukhov.org/ru/post/2025/04/decode-and-print-jwt-token/ "Как декодировать и вывести полезную нагрузку JWT токена в Linux bash") - [Параметры командной строки MinIO](https://www.glukhov.org/ru/post/2025/05/minio-cheatsheet/ "Справочник по параметрам командной строки MinIO")