Bh komut dosyası için 'Ctrl + c' tuşunu basılı tutun, ancak bu komut dosyasında açılan işlem için değil


11

Bir bash betiğinde etkileşimli bir programa sahip olmaya çalıştım:

my_program

Ve bunu 'Ctrl + c' ile kapatabilmek istiyorum. Ama bunu yaptığımda senaryom da kapanıyor.

Biliyorum.

trap '' 2
my_program
trap 2

Ama bu durumda, my_programCtrl + c ile kapatamıyorum.

Bir programda Ctrl + c'ye nasıl izin vereceğiniz, ancak onu çalıştıran komut dosyasını kapatmamanız hakkında bir fikriniz var mı?

EDIT: örnek ekle

#!/bin/bash
my_program
my_program2

İ sona Ctrl + c kullanırsanız my_program, my_program2bütün script çıkıldı çünkü hiçbir zaman yürütülür.

Yanıtlar:


13

Kullanmalı trap true 2veya trap : 2yerine kullanmalısınız trap '' 2. Bir bash kabuğundaki "yardım tuzağı" bunun hakkında söylüyor:

ARG null dizeyse, her SIGNAL_SPEC kabuğu ve çağırdığı komutlar tarafından yoksayılır .

Misal:

$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
   <press control-C>
^Cfirst cat killed
   <press control-C>
^Csecond cat killed
done

2
Bir taildahaki sefere kedileri öldürmek yerine s öldürmeye ne dersin ?
kubanczyk

12

Trap komutunu -eylem bağımsız değişkeni olarak vererek bir tuzağı varsayılana sıfırlayabilirsiniz . Bunu bir alt kabukta yaparsanız , üst kabuktaki tuzağı etkilemez. Komut dosyanızda, Ctrl-C ile kesilmesi gereken her komut için bunu yapabilirsiniz:

#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.

1
Kabul edilen cevap muhtemelen kabuk için daha iyi ve daha kanonik olsa da, bu, kendi kendine büyük bir cevaptır, çünkü bu tür sinyal maskeleme / göz ardı etmenin nasıl güvenli bir şekilde yapılacağına dair genel prensibi (kabuğa özgü değil) tanıtmasıdır.
R .. GitHub BUZA YARDIMCI DURDUR

Sanırım exec my_programsubshell'de biraz daha verimli olabilirsiniz.
Toby Speight

@R .. kesinlikle kabuğa özgü değildir - SIG_IGN'a bir sinyal ayarlarsanız (boş bir dize ile bu tuzak yapıyor), bu durum SIGCHLD hariç exec () aracılığıyla devralınır. Bu POSIX zorunlu davranışıdır. Ayrıca bkz. Stackoverflow.com/questions/32708086/…
mosvy

@mosvy: Yorumumun hangi kısmına katılmadığınızı görmüyorum. Demek istediğim, "çataldan önce maske / yoksay, yürütmeden önce çocukta maskeyi kaldır / unignore", sadece kabuk programlama bağlamının dışında bilmek için yararlı olan genel bir prensipti.
R .. GitHub BUZA YARDIMCI DURDUR

1
Bu çok faydalı bir cevap. Deneyimli bir Linux kullanıcısı olarak, bunu daha önce hiç duymadığımı söyleyebilirim. Oldukça fazla kullanımı var ... benim oyumu ve yer işaretimi aldın.
Dev

-1


Eğer kullandığınızda Crtl+ C, sen kesme programı ( " öldürmek " it).
Muhtemelen aradığınız şey programınızı askıya almaktır (" duraklat "). Bunun için Crtl+ kullanabilirsiniz Z.
Programınız duraklatıldıktan sonra düğmesini kullanarak görebilirsiniz jobs. Örneğin:
[1]+ Stopped ./foobar
Burada sadece bir işim, # 1 işim var, ancak birden fazla olabilir - her işin kendi numarası vardır.
Örneğin, komutların bir dizi kullanarak size askıya sürecini kontrol edebilirsiniz bg, fgve kill.
bg %1iş 1. yeniden başlayacaktır b ack gr yuvarlak
fg %1irade yeniden başlatma iş 1. f cevherig yuvarlak
kill %1işi 1. öldürecek
kendinizin kullanabileceği Not bgve fgsadece tek bir aktif iş varsa argüman olmadan.


Teşekkür ederim ama hayır, Ctrl + c yapmak istiyorum.
bob dylan
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.