Bash fonksiyonlarında tuzak nasıl kurulur?


13

trapBash komut dosyalarında kurulum yapabilirim , ancak bash işlevlerini ayarlayamıyorum .

Örneğin, sourceaşağıdaki kod ve çalıştırın f, şimdi Ctrl+ deneyin C, tuzağa düşürülmüş değil!

trapBash fonksiyonlarında nasıl kurulur?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
fKodunuzun sonuna bir koyabilir ve f ().
GWF

Yanıtlar:


7

Bunun nedeni, bash(komut dosyasını çalıştıran) yerine SIGINT'i ön planda işleme göndermesidir . Bunu yapmak istiyorsanız, işlevi asenkron hale getirin ve sonra kullanın wait(beklendiği gibi davranacak ve tuzağı kullanacaktır).


Bu bir tür işler. Ama ben fbir borudaysa echo 123 | f, o zaman tuzak değil mi buldum ?
Cheng

@Cheng Bir alt kabuk kullanın (ve bu durumda bir boru yine de gereksizdir, sadece bir heredoc / herestring kullanın). (command | command) &
Chris Down

1

PROTIP: Ön plan süreci ile QUIT Gönder Ctrl- \zaman Ctrl- C, - Z, - Dçalışmıyor.

İle yürütme sonunda tuzakları temizle trap - list of signals here

Üretim dışı bir sistemde eğlence: Tüm hassas sinyaller için bir tuzak kurmayı deneyin (ör. KILL değil). kill -l(bu bir küçük harf L değil bir sayı 1 veya boru değil |)


0

Bence işlevi global yapmalısın

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

INTve SIGINTeşanlamlıdır - fark etmez.
Chris Down
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.