Скрипты 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.
Помните, что правильная обработка сигналов не только повышает удобство работы пользователя, но и обеспечивает надежное и безошибочное выполнение сценариев.