Обработка Ctrl-C в сценариях Bash: подробное руководство

Скрипты Bash — это мощные инструменты для автоматизации задач и выполнения команд. Однако иногда возникает необходимость обрабатывать прерывания, например, когда пользователь нажимает Ctrl-C для преждевременного завершения сценария. В этой статье мы рассмотрим различные методы перехвата и обработки сигналов Ctrl-C в сценариях Bash, попутно предоставляя примеры кода.

Метод 1: использование команды-ловушки
Самый простой способ перехватить сочетание клавиш Ctrl-C в сценарии Bash — использовать команду trap, которая позволяет указать команду или функцию, которая будет выполняется при получении сигнала. Вот пример:

#!/bin/bash
# Function to be executed on Ctrl-C
cleanup() {
    echo "Cleaning up..."
    # Add your cleanup logic here
    exit 1
}
# Set the trap
trap cleanup SIGINT
# Your script code here
echo "Running script..."
# Add your script logic here

В этом примере функция cleanupвыполняется, когда скрипт получает сигнал SIGINT (генерируемый сочетанием клавиш Ctrl-C). Вы можете настроить логику очистки в соответствии со своими требованиями.

Метод 2: проверка статуса завершения
Другой подход заключается в проверке статуса завершения предыдущей команды с использованием специальной переменной $?. Если значение равно 130, это означает, что сценарий был прерван нажатием Ctrl-C. Вот пример:

#!/bin/bash
# Your script code here
echo "Running script..."
# Add your script logic here
# Check the exit status
if [ $? -eq 130 ]; then
    echo "Script terminated by Ctrl-C."
    # Add your cleanup logic here
    exit 1
fi

В этом примере мы проверяем, равен ли $?130, что указывает на то, что сценарий был завершен нажатием Ctrl-C. При необходимости вы можете выполнить операции очистки или обработать прерывание.

Метод 3: использование цикла while
Вы также можете использовать цикл while для постоянной проверки наличия переменной-флага, указывающей, было ли нажато сочетание клавиш Ctrl-C. Вот пример:

#!/bin/bash
# Flag variable
interrupted=false
# Function to be executed on Ctrl-C
cleanup() {
    echo "Cleaning up..."
    # Add your cleanup logic here
    exit 1
}
# Set the trap
trap cleanup SIGINT
# Check for interruption in a while loop
while true; do
    if [ "$interrupted" = true ]; then
        echo "Script interrupted."
        # Add your cleanup logic here
        exit 1
    fi
    # Your script code here
    echo "Running script..."
    # Add your script logic here
done

В этом примере мы используем переменную-флаг interrupted, чтобы проверить, был ли сценарий прерван. Функция cleanupвыполняется при нажатии Ctrl-C, при этом для флага interruptedустанавливается значение true.

Обработка прерываний Ctrl-C в сценариях Bash имеет решающее значение для корректного завершения и правильной очистки. В этой статье мы рассмотрели три метода: использование команды trap, проверка статуса выхода и использование цикла while. В зависимости от требований вашего скрипта вы можете выбрать наиболее подходящий метод для эффективной обработки сигналов Ctrl-C.

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