Стандартные инструменты для диагностики системы Linux
Ядро:
*
*
*
* l
*
Ввод/вывод:
*
*
*
*
blktrace
Системные и библиотечные вызовы:
*
*
Аппаратные счётчики:
*
*
Сеть:
*
*
*
*
*
*
*
*
Процессы:
*
*
*
*
Процессор:
*
*
*
Универсальные:
*
*
*
*
*
Ядро:
*
perf
— (в прошлом performance counters for Linux) — доступ к различным внутренним счётчикам ядра; незаменимый инструмент для выполнения профайлинга ядра/операционной системы*
ftrace
— трассировщик вызовов функций внутри ядра Linux*
stap
— скриптовый язык и инструмент для комплексной диагностики ядра и процессов Linux* l
ttng
— (Linux Trace Toolkit Next Generation) инструмент для трассировки ядра, программ и библиотек Linux*
bcc
(BPF) — (сравнительно) новый и очень мощный инструмент для трассировки и манипуляции ядром Linux, основанный на Berkeley Packet Filter, позволяет делать космические вещиВвод/вывод:
*
iostat
(sysstat) — статистика ввода/вывода по заданному устройству (количество операций записи/чтения в единицу времени, скорость записи/чтения)*
pidstat
(sysstat) — нагрузка на процессор, память и устройства от конкретного процесса (заданного по имени или номеру)*
pcstat
— использование кэша (какой процент файла попадает в кэш, какой нет)*
lsof
— информация об открытых процессом файлахblktrace
Системные и библиотечные вызовы:
*
strace
— информация о системных вызовов, выполняемых процессом, позволяет понять или по крайней мере лучше разобраться, почему процесс висит или потребляет много ресурсов*
ltrace
— трассировка библиотечных вызовов (которые не обязательно являются системными)Аппаратные счётчики:
*
tiptop
— информация о процессах в реальном времени, похожа на top, но в отличие от него данные преимущественно берутся с аппаратных счётчиков*
numastat
— просмотр информации об использовании памяти процессами/процессорами в системах с NUMA-архитектуройСеть:
*
netstat
— классический инструмент для просмотра конфигурации сети (сокетов, интерфейсов и так далее)*
ss
— socket statistics, позволяет получить информацию об открытых сокетах и их состоянии (похожа на netstat, но умеет больше)*
ethtool
— просмотр настроек и состояния ethernet-интерфейса*
snmpget
— получение данных по SNMP*
lldptool
— настройка LLDP и просмотр данных LLDP*
nicstat
— статистика использования сетевой карты (сетевого интерфейса)*
ip
— конфигурация и статистика стека TCP/IP Linux*
ifstat
— статистика использования сетевого интерфейса в реальном времениПроцессы:
*
top
— информация о наиболее активных (наиболее ресурсоёмки) процессах + общая информация о системе*
vmstat
— данные об использовании виртуальной памяти*
free
— информация о свободной памяти, кэше, буферах*
slabtop
— информация о заполнении SLAB-кэшаПроцессор:
*
mpstat
(sysstat) — общая информация об использовании процессора (одного или всех процессоров)*
turbostat
(kernel-tools) — информация о топологии процессора, частоте, питании, температуре*
rdmsr
— (Read from Model Specific Register) чтение из моделезависимых регистров (позволяет оценить использование LLC-кэша и прочее)Универсальные:
*
sar
— (system activity report) информация о системной активности в реальном времени (диск, память, процессор и так далее)*
dstat
— универсальный инструмент для сбора информации о системе (vmstat, iostat, netstat, ifstat и ещё много других в одном флаконе)*
dmesg
— журнал сообщений ядра с момента загрузки системы*
/proc
— псевдофайловая система предоставляющая доступ к внутренним данным/счётчикам ядра*
sysdig
— универсальный инструмент для сбора и анализа данных о системе (сотни различных источников скомбинированные вместе)❤3
Трюки терминала Bash
Полезные комбинации клавиш (хоткеи) и небольшие хитрости, которые сделают Вашу работу в Linux более эффективной.
Горячие клавиши" Bash с Ctrl
Изменить заглавные на строчные и наоборот
Запустить предыдущую команду ещё раз
Запустить команду из истории по номеру (например, 53)
Запускает последнюю команду и меняет какой-то параметр. Например, меняем
Важно: предыдущая команда заменит только первое вхождение "aaa". Если вы хотите заменить все вхождения, используйте
Запустить последнюю команду, которая начинается с...
Например, до этого в истории команд была команда cat filename:
— запускает
Указание файлов по шаблону в Bash
Полезные переменные окружения Bash
Короткие переменные:
Более длинные, но тоже полезные переменные:
Полезные комбинации клавиш (хоткеи) и небольшие хитрости, которые сделают Вашу работу в Linux более эффективной.
Горячие клавиши" Bash с Ctrl
Ctrl + n
— то же самое, что и стрелка вниз.Ctrl + p
— то же самое, что и стрелка вверх.Ctrl + r
— поиск по предыдущим командам из истории команд (history). Продолжайте нажимать Ctrl + r
, чтобы искать дальше. Ctrl + Shift + r
— поиск в другую сторону.Ctrl + s
— остановить вывод в терминал.Ctrl + q
— восстановить вывод в терминал после Ctrl + s.Ctrl + a
— перейти к началу строки (аналог клавиши Home).Ctrl + e
— перейти к концу строки (аналог клавиши End).Ctrl + d
— если вы ввели что-то, то Ctrl + d
удаляет символ под курсором. В противном случае означает конец ввода и завершает текущую сессию Bash.Ctrl + k
— удалить весь текст от курсора до конца строки.Ctrl + x + backspace
— удалить весь текст от начала строки до курсора.Ctrl + t
— переставить символ до курсора на символ под курсором. Нажмите Esc + t
для перестановки двух слов до курсора.Ctrl + w
— удалить слово до курсора; затем Ctrl + y, чтобы вставить его.Ctrl + u
— удалить строку перед курсором; Ctrl + y для вставки его.Ctrl + _
— отменить ввод.Ctrl + l
— очищает окно терминала. То же самое, что и clear.Ctrl + x + Ctrl + e
— запускает редактор, определённый в переменной $EDITOR
, для ввода команды. Полезно для многострочных команд.Изменить заглавные на строчные и наоборот
Esc + u
— преобразовать буквы от курсора до конца строки в заглавные буквы.Esc + l
— преобразовать буквы от курсора до конца строки в нижний регистр.Esc + c
— заменить букву под курсором на заглавную.Запустить предыдущую команду ещё раз
Запустить команду из истории по номеру (например, 53)
!53
!!
— запуск последней команды.sudo !!
— запустить предыдущую команду с sudo.Запускает последнюю команду и меняет какой-то параметр. Например, меняем
"aaa" на "bbb":
# Последняя команда: echo 'aaa'
$ ^aaa^bbb
$ echo 'bbb'
bbb
Важно: предыдущая команда заменит только первое вхождение "aaa". Если вы хотите заменить все вхождения, используйте
:&
:^aaa^bbb^:&
# или
!!:gs/aaa/bbb/
Запустить последнюю команду, которая начинается с...
Например, до этого в истории команд была команда cat filename:
!cat
# или
!c
— запускает
cat filename
ещё раз.Указание файлов по шаблону в Bash
/etc/pa*wd
→ /etc/passwd
— символ *
означает "несколько любых символов"./b?n/?at
→ /bin/cat
— символ ?
означает "один любой символ".ls -l [a-z]*
— вывести список файлов, содержащих только буквы латинского алфавита. В квадратных скобках []
перечисляются символы, которые будут искаться. А символ *
после []
означает "хоть сколько раз".ls {*.sh,*.py}
— вывести все .sh и .py файлы. {}
используется для группировки нескольких шаблонов по принципу "или".Полезные переменные окружения Bash
Короткие переменные:
$0
— оболочка командной строки или путь до запускаемого файла.$1
, $2
, $3
, ... — аргументы запуска скрипта.$#
— число аргументов, переданных в скрипт из терминала.$?
— код завершения последней команды.$-
— текущие опции, установленные для оболочки.$$
— идентификатор текущего процесса.$!
— идентификатор процесса, завершённого последним.Более длинные, но тоже полезные переменные:
$DESKTOP_SESSION
— текущий менеджер дисплеев.$EDITOR
— редактор текста по умолчанию.$LANG
— используемый системой язык.$PATH
— список директорий, в которых будут искаться исполняемые файлы.$PWD
— текущая директория.$SHELL
— текущая оболочка командной строки.$USER
— имя текущего пользователя.$HOSTNAME
— имя текущего хоста (компьютера).❤5👍2
Bash. Проверки файлов
Kоманды позволяют проверять различные условия, касающиеся файлов
#!/bin/bash
Kоманды позволяют проверять различные условия, касающиеся файлов
-d file
# Проверяет, существует ли файл, и является ли он директорией.-e file
# Проверяет, существует ли файл.-f file
# Проверяет, существует ли файл, и является ли он файлом.-r file
# Проверяет, существует ли файл, и доступен ли он для чтения.-s file
# Проверяет, существует ли файл, и не является ли он пустым.-w file
# Проверяет, существует ли файл, и доступен ли он для записи.-x file
# Проверяет, существует ли файл, и является ли он исполняемым.file1 -nt file2
# Проверяет, новее ли file1, чем file2.file1 -ot file2
# Проверяет, старше ли file1, чем file2.-O file
# Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.-G file
# Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ] # если файл сущетсвует и он является директорией
then
echo "The $mydir directory exists" # выводим сообщение
cd $mydir # переходим в него
ls # отображаем содержимое
else # ИНАЧЕ
echo "The $mydir directory does not exist"
fi
❤2👍2
Работа с файлами и папками PowerShell
Перечисление всех файлов и папок в папке
Все элементы можно получить непосредственно в папке с помощью Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает прямое содержимое диска C:PowerShell.
Команда перечисляет только непосредственно содержащиеся элементы, например команду dir в cmd.exe оболочке UNIX или ls в ней. Чтобы отобразить элементы в вложенной папке, необходимо указать параметр Recurse . Следующая команда выводит список всех элементов на C: диске:
Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Вы можете выполнять сложную фильтрацию на основе других свойств элементов с помощью Where-Object.
Следующая команда находит все исполняемые файлы в папке Program Files, которые были изменены после 1 октября 2005 года, и они не меньше 1 мегабайт или больше 10 мегабайт:
Копирование файлов и папок
Копирование выполняется с помощью командлета Copy-Item. Следующая команда создает резервную копию скрипта профиля PowerShell:
Команда Test-Path проверка, существует ли скрипт профиля.
Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.
Эта команда работает, даже если целевой объект доступен только для чтения.
Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.
Можно также скопировать избранные элементы. Следующая команда копирует все .txt файлы, содержащиеся в любом месте в C:\dataC:\temp\text:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Вы по-прежнему можете выполнять собственные команды, такие как xcopy.exe и robocopy.exe копировать файлы.
Создание файлов и папок
Создание новых элементов работает одинаково для всех поставщиков PowerShell. Если поставщик PowerShell имеет несколько типов элементов, например поставщик FileSystem PowerShell различает каталоги и файлы, необходимо указать тип элемента.
Эта команда создает папку C:\temp\New Folder:
Эта команда создает пустой файл C:\temp\New Folder\file.txt.
Удаление всех файлов и папок в папке
Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, если вы попытаелись удалить папку C:\temp\DeleteMe , содержащую другие элементы, PowerShell запрашивает подтверждение перед удалением папки:
Если вам не нужно запрашивать каждый содержащийся элемент, укажите параметр Recurse :
Перечисление всех файлов и папок в папке
Все элементы можно получить непосредственно в папке с помощью Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает прямое содержимое диска C:PowerShell.
Get-ChildItem -Path C:\ -Force
Команда перечисляет только непосредственно содержащиеся элементы, например команду dir в cmd.exe оболочке UNIX или ls в ней. Чтобы отобразить элементы в вложенной папке, необходимо указать параметр Recurse . Следующая команда выводит список всех элементов на C: диске:
Get-ChildItem -Path C:\ -Force -Recurse
Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Вы можете выполнять сложную фильтрацию на основе других свойств элементов с помощью Where-Object.
Следующая команда находит все исполняемые файлы в папке Program Files, которые были изменены после 1 октября 2005 года, и они не меньше 1 мегабайт или больше 10 мегабайт:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
Where-Object -FilterScript {
($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
}
Копирование файлов и папок
Копирование выполняется с помощью командлета Copy-Item. Следующая команда создает резервную копию скрипта профиля PowerShell:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}
Команда Test-Path проверка, существует ли скрипт профиля.
Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}
Эта команда работает, даже если целевой объект доступен только для чтения.
Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
Можно также скопировать избранные элементы. Следующая команда копирует все .txt файлы, содержащиеся в любом месте в C:\dataC:\temp\text:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Вы по-прежнему можете выполнять собственные команды, такие как xcopy.exe и robocopy.exe копировать файлы.
Создание файлов и папок
Создание новых элементов работает одинаково для всех поставщиков PowerShell. Если поставщик PowerShell имеет несколько типов элементов, например поставщик FileSystem PowerShell различает каталоги и файлы, необходимо указать тип элемента.
Эта команда создает папку C:\temp\New Folder:
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
Эта команда создает пустой файл C:\temp\New Folder\file.txt.
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File
Удаление всех файлов и папок в папке
Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, если вы попытаелись удалить папку C:\temp\DeleteMe , содержащую другие элементы, PowerShell запрашивает подтверждение перед удалением папки:
Remove-Item -Path C:\temp\DeleteMe
Если вам не нужно запрашивать каждый содержащийся элемент, укажите параметр Recurse :
Remove-Item -Path C:\temp\DeleteMe -Recurse
❤2👍1
Понимание Inode’ов
Понимание inode’ов критически важно для понимания файловых систем Unix. Файлы содержат данные и метаданные. Метаданные — это информация о файле. Метаданные хранятся в inode. Содержимое inode включает:
- Номер inode
- UID
- GID
- Размер
- Atime (время последнего доступа)
- Mtime (время последней модификации)
- Ctime (время последнего изменения метаданных)
- Размер блока
- Режим (права доступа и тип файла)
- Количество жёстких ссылок
- ACL (списки контроля доступа)
Обычно inode занимает 256 байт. Имена файлов не хранятся в inode — они находятся в данных, относящихся к директории. Как правило, имена файлов хранятся линейно, из-за чего поиск по имени может быть медленным. Файловые системы Ext4 и XFS используют более эффективные B-деревья (Btrees) для хранения имён файлов в директориях, что обеспечивает постоянное время поиска, в отличие от линейного.
Dentry (сокращение от directory entry — запись в директории) используется для хранения связи между inode и именем файла в директории.
Inode может содержать как прямые (direct), так и косвенные (indirect) указатели на блоки данных файла. Прямой указатель означает, что inode содержит номер блока, в котором находятся данные файла. Косвенный указатель означает, что inode содержит номер блока, в котором находятся номера других блоков с данными.
Файловая система Ext создаёт фиксированное количество inode’ов при форматировании. Если inode’ы заканчиваются, необходимо форматировать файловую систему. В отличие от неё, XFS не использует фиксированное количество inode’ов — они создаются по мере необходимости.
При удалении файла системный вызов unlink() удаляет запись в директории, указывающую на inode, и помечает inode как свободный. Сами блоки данных при этом не удаляются.
Количество жёстких ссылок на файл хранится в inode. Каждый раз при создании жёсткой ссылки это число увеличивается. Символические (soft) ссылки не увеличивают счётчик ссылок на файл или директорию.
Суперблок содержит метаданные о файловой системе. Обычно в файловой системе хранится несколько копий суперблока на случай повреждения основной. Некоторые из данных, хранящихся в суперблоке:
– Размер файловой системы
– Размер блока
– Количество свободных и занятых блоков
– Размер и расположение таблицы inode’ов
– Карта блоков диска
Информацию о суперблоке можно получить с помощью команды:
Понимание inode’ов критически важно для понимания файловых систем Unix. Файлы содержат данные и метаданные. Метаданные — это информация о файле. Метаданные хранятся в inode. Содержимое inode включает:
- Номер inode
- UID
- GID
- Размер
- Atime (время последнего доступа)
- Mtime (время последней модификации)
- Ctime (время последнего изменения метаданных)
- Размер блока
- Режим (права доступа и тип файла)
- Количество жёстких ссылок
- ACL (списки контроля доступа)
Обычно inode занимает 256 байт. Имена файлов не хранятся в inode — они находятся в данных, относящихся к директории. Как правило, имена файлов хранятся линейно, из-за чего поиск по имени может быть медленным. Файловые системы Ext4 и XFS используют более эффективные B-деревья (Btrees) для хранения имён файлов в директориях, что обеспечивает постоянное время поиска, в отличие от линейного.
Dentry (сокращение от directory entry — запись в директории) используется для хранения связи между inode и именем файла в директории.
Inode может содержать как прямые (direct), так и косвенные (indirect) указатели на блоки данных файла. Прямой указатель означает, что inode содержит номер блока, в котором находятся данные файла. Косвенный указатель означает, что inode содержит номер блока, в котором находятся номера других блоков с данными.
Файловая система Ext создаёт фиксированное количество inode’ов при форматировании. Если inode’ы заканчиваются, необходимо форматировать файловую систему. В отличие от неё, XFS не использует фиксированное количество inode’ов — они создаются по мере необходимости.
При удалении файла системный вызов unlink() удаляет запись в директории, указывающую на inode, и помечает inode как свободный. Сами блоки данных при этом не удаляются.
Количество жёстких ссылок на файл хранится в inode. Каждый раз при создании жёсткой ссылки это число увеличивается. Символические (soft) ссылки не увеличивают счётчик ссылок на файл или директорию.
Суперблок содержит метаданные о файловой системе. Обычно в файловой системе хранится несколько копий суперблока на случай повреждения основной. Некоторые из данных, хранящихся в суперблоке:
– Размер файловой системы
– Размер блока
– Количество свободных и занятых блоков
– Размер и расположение таблицы inode’ов
– Карта блоков диска
Информацию о суперблоке можно получить с помощью команды:
dumpe2fs /dev/mount | grep -i superblock
❤2
Список полезных команд для работы с
Основные команды
1. Подключение к удаленному хосту:
Пример:
Подключается к хосту
2. Закрытие соединения:
Чтобы завершить сессию, используйте сочетание клавиш:
Затем введите:
3. Отправка текстового запроса после подключения:
Если подключились к порту, например, HTTP-сервера, можно отправить запрос вручную:
Это выполняет запрос к домашней странице на порту 80.
Встроенные команды
1. help
Показывает список доступных команд
2. open
Открывает новое соединение с указанным хостом:
3. close
Закрывает текущее соединение:
4. display
Показывает текущие параметры подключения:
5. mode
Переключает режим работы
6. send
Отправляет управляющие символы (например,
7. status
Показывает статус текущего соединения:
8. set и unset
Настраивают параметры подключения (например, установка режима эхо):
Примеры использования
1. Проверка доступности порта:
Чтобы проверить, открыт ли порт на удаленном сервере:
2. Проверка почтового сервера (SMTP):
Подключение к серверу SMTP:
Затем можно вручную ввести SMTP-команды, такие как:
3. Проверка DNS сервера:
Можно подключиться к DNS-серверу и проверить его ответы:
Эти команды помогут вам для отладки, диагностики и проверки сетевых служб.
telnet
, которые могут помочь при подключении и отладке сетевых служб:Основные команды
telnet
:1. Подключение к удаленному хосту:
telnet <hostname> <port>
Пример:
telnet example.com 80
Подключается к хосту
example.com
на порту 80 (HTTP).2. Закрытие соединения:
Чтобы завершить сессию, используйте сочетание клавиш:
Ctrl + ] (переход в режим команд)
Затем введите:
quit
3. Отправка текстового запроса после подключения:
Если подключились к порту, например, HTTP-сервера, можно отправить запрос вручную:
GET / HTTP/1.1
Host: example.com
Это выполняет запрос к домашней странице на порту 80.
Встроенные команды
telnet
(используйте в режиме команд после нажатия `Ctrl + ]`):1. help
Показывает список доступных команд
telnet
:
telnet> help
2. open
Открывает новое соединение с указанным хостом:
telnet> open <hostname> <port>
3. close
Закрывает текущее соединение:
telnet> close
4. display
Показывает текущие параметры подключения:
telnet> display
5. mode
Переключает режим работы
telnet
(например, line
или `character`):
telnet> mode line
6. send
Отправляет управляющие символы (например,
send escape
для отправки escape-секвенции):
telnet> send escape
7. status
Показывает статус текущего соединения:
telnet> status
8. set и unset
Настраивают параметры подключения (например, установка режима эхо):
telnet> set echo
telnet> unset echo
Примеры использования
telnet
:1. Проверка доступности порта:
Чтобы проверить, открыт ли порт на удаленном сервере:
telnet <hostname> <port>
2. Проверка почтового сервера (SMTP):
Подключение к серверу SMTP:
telnet smtp.example.com 25
Затем можно вручную ввести SMTP-команды, такие как:
EHLO example.com
3. Проверка DNS сервера:
Можно подключиться к DNS-серверу и проверить его ответы:
telnet <dns-server> 53
Эти команды помогут вам для отладки, диагностики и проверки сетевых служб.
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Как работают протоколы в модели TCP IP?
❤1
Как отлаживать bash-script-ы по шагам
Мне всегда хотелось иметь возможность отлаживать bash-scripts так же, как и любой другой код, т.е. по шагам, и bash такую возможность предусмотрел, но о ней не все знают. Несмотря на довольно большой опыт использования Linux, я дошёл до неё только недавно.
Волшебная строчка, которую нужно добавить после #!/bin/bash, чтоб скрипт можно было отлаживать по шагам
Процесс отладки
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
Ингредиенты
команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо Ctrl+C
переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.
Мне всегда хотелось иметь возможность отлаживать bash-scripts так же, как и любой другой код, т.е. по шагам, и bash такую возможность предусмотрел, но о ней не все знают. Несмотря на довольно большой опыт использования Linux, я дошёл до неё только недавно.
Волшебная строчка, которую нужно добавить после #!/bin/bash, чтоб скрипт можно было отлаживать по шагам
#!/bin/bash
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
echo line3
Процесс отладки
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
Ингредиенты
команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо Ctrl+C
переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.
# Online Bash Shell.
# Code, Compile, Run and Debug Bash script online.
# Write your code in this editor and press "Run" button to execute it.
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
echo line3
echo "Hello World";
❤1