Eğer ctrl-c (veya benzeri) yakalamak ve çıkmadan önce temizlemek için trap
örneğin http://linuxcommand.org/wss0160.php#trap açıklandığı gibi kullanırsanız o zaman iade çıkış kodunu değiştiriyorum.
Şimdi bu muhtemelen gerçek dünyada bir fark yaratmayacaktır (örneğin, çıkış kodları taşınabilir olmadığından ve bunun üzerine , işlem sonlandırıldığında Varsayılan çıkış kodunda tartışıldığı gibi her zaman açık değil mi? ) Ama yine de var olup olmadığını merak ediyorum gerçekten bunu önlemek ve yerine kesintiye komut dosyaları için varsayılan hata kodunu döndürmek için bir yolu yok?
Örnek (bash dilinde, ancak sorum bash'a özgü sayılmamalıdır):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Çıktı:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Daha fazla POSIX uyumlu hale getirmek için kaldırılmak üzere düzenlenmiştir.)
(Bunun yerine bir bash betiği yapmak için tekrar düzenlendi, soruma kabuk özel değil.)
Taşınabilir olmayan "SIGINT" lehine tuzak için taşınabilir "INT" kullanmak üzere düzenlenmiştir.
İşe yaramaz kıvırcık parantezleri kaldırmak ve potansiyel çözüm eklemek için düzenlenmiştir.
Güncelleme:
Şimdi sadece kodlanmış bazı hata kodları ile çıkıp EXIT yakalayarak çözdüm. Bu, bazı sistemlerde sorunlu olabilir, çünkü hata kodu farklı olabilir veya EXIT tuzağı mümkün olmayabilir, ancak benim durumumda yeterince iyi.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
şu anki işlemden girdi okuduğunu söylüyor .
read
geçerli işlemden okumayıtrap cmd SIGINT
söylüyorsunuz ve standart kullanmanız gerektiğini söylediği gibi çalışmayacaktrap cmd INT
.