Bash betiğinde Ctrl-C


22

Komut dosyası kesilmekte ve komut dosyası tarafından başlatılmakta olan çalışmakta olan komutun kesilmesi için bash komut dosyalarında ctrl+ cişleme yöntemini nasıl uygularım ?

(Uzun süren bazı komutları çalıştıran bir komut dosyası olduğunu hayal edin. Kullanıcı ctrl+ ctuşuna basıp komutu keser, ancak komut dosyası devam eder.) Her ikisinin de öldürüldüğü şekilde davranmasını istiyorum.


1
İşletim sisteminizde iş denetimi etkinse, başka bir seçenek de bu betiği durdurmaktır (genellikle crtl-z ile). Bu işe arka planda devam edebilir bg, onu öldürebilir veya ön planda devam ettirebilirsiniz fg. Bash manpage bölümüne bakın JOB CONTROL.
ott--

Yanıtlar:


25

Bunu, SIGINT alındığında aramak istediğiniz bir alt yordam oluşturarak ve çalıştırmanız gerekir trap 'subroutinename' INT.

Örnek:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
Ayrıca EXIT, komut dosyasının nasıl durduğuna bakılmaksızın, istediğiniz zaman çalıştırmak istediğiniz bir şeyin olduğu durumlarda kapanabileceğinizi unutmayın. ( KILLelbette hariç).
Blrfl

Çok teşekkürler! Bununla birlikte, 'uyku' öldürüldüğünde - kabuk tuzak rutini çalışırken bir sonraki komutu yerine getirmeyi başarabilir: bu durumda 'yankı' ... ya da yanlış mıyım?
kolypto

Bu mümkün olmamalı, hayır. Paralel görevler yapmaz.
Kvisle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.