Шпаргалка по Bash — команды Linux для Ubuntu, Mint и Debian

Некоторые параметры командной строки инструментов

Содержимое страницы

Не очень полный список, но некоторые пункты полезны для меня

bash and shell anniversary!

Для получения большего количества инструментов разработчика и рабочих процессов см. Инструменты разработчика: Полное руководство по современным рабочим процессам разработки.

Если вам нужен интерактивный шаблон ввода в скриптах, см. Пауза скриптов с нажатием любой клавиши в Bash, CMD, PowerShell и macOS.

Как проверить версию Linux Ubuntu

Для получения более подробной информации о проверке версии Ubuntu см. Проверка версии Linux Ubuntu.

Метод 1

lsb_release -a

выдаст что-то вроде

No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 22.1
Release:	22.1
Codename:	xia

Метод 2

cat /etc/os-release

выдаст что-то вроде

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

Сжатие

tar -zcvf archive-name.tgz directory-name

Распаковка

tar -zxvf archive-name.tgz

Доступ к удаленному серверу в Bash через SSH и SCP

Передача идентификационных данных пользователя на удаленный сервер

ssh-copy-id user@10.0.0.225

Таким образом, следующий вход будет возможен без пароля:

ssh user@10.0.0.225

Загрузка файла

scp ~/file.ext user@host-ip:/home/user/file.ext

Скачивание папки с вложенными файлами рекурсивно

scp -r user@host-ip:/home/user/dir ~/dir

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

Проверка существования

# создать папку, если она не существует, со всеми промежуточными папками
[ -d $repdir ] || mkdir -p $repdir

# или
if [ -d $fname ]; then
  echo "Файл не существует: $fname"
  return
fi

Создание папки для конкретного пользователя

sudo mkdir dir1
sudo chown specific_user dir1
sudo chown :specific_group dir1

Перебор файлов в папке

# этот пример конвертирует все файлы jpg в некоторой папке в формат fits
for f in some-folder/*.jpg
do
  convert "$f" "${f/.jpg/.fits}"
done

Объединение всех файлов в один

cat ./* > merged.txt

Добавление команд в Crontab

(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 - скрипт, который будет выполнен
  • /home/user/stest - параметр скрипта - доступен как $1
  • /home/user/stest/stest.log - файл логов с выводом консоли от stest.sh

Проверка

grep /home/user/stest/stest.sh /var/log/syslog
crontab -e

Мониторинг файлов логов в Bash

Просмотр лог-файла в реальном времени

sudo tail -f /var/log/megalog.log

Получение HTTP-кода статуса с помощью 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

Предположим, что у вас запущена программа в переднем плане, нажмите:

  • ctrl-Z, затем:

[1]+ Stopped myprogram

  • disown -h %1
  • bg 1

[1]+ myprogram &

  • logout

Генерация JSON в Bash с помощью jo

Установка jo

sudo apt-get install jo
a="123"
b="456"
jo "model=a" "prompt=b" "stream=false"

выведет

{"model":"a", "prompt":"b", "stream":false}

Чуть более сложный пример:

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

Использовать

| jq .

Для форматирования JSON, сгенерированного выше:

a="123"
b="456"
jo "model=$a" "prompt=$b" "stream=false" | jq .

Отформатированный JSON будет выглядеть так:

{
  "model": 123,
  "prompt": 456,
  "stream": false
}

Парсинг JSON и извлечение значений полей в Bash

Сначала установите jq

sudo apt-get install jq

Использовать

  | jq -r '.fieldName'

Например, для парсинга ответа от вызова Ollama:

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

вернет что-то вроде

261 filename.txt

Если вам нужно только число, можно отсечь первое слово, которое является числом:

words=`wc -w filename.txt | cut -f1 -d' '`
echo "$words words"

Или использовать wc как:

words=`wc -w < filename.txt`
echo "$words words"

Проверка использования дискового пространства в директории

du ~/dirname

Получение пути к директории скрипта в Bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

Измерение времени выполнения скрипта в Bash

Один из вариантов — использовать функцию time:

time your_script.sh

Другой способ чуть более сложен:

start=`date +%s`

# очень важный код
# идет здесь

end=`date +%s`

runtime=$((end-start))

Сравнение двух файлов с помощью VS Code

code -d <файл 1> <файл 2>

Проверка доступных пакетов в репозитории Ubuntu

sudo apt-cache policy <packageName>

Полезные ссылки

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.