วิธีการตั้งค่ากับดักในฟังก์ชั่นทุบตี?


13

ฉันสามารถตั้งค่าtrapในสคริปต์ทุบตี แต่ไม่ใช้ฟังก์ชันทุบตี

ตัวอย่างเช่นsourceรหัสด้านล่างและเรียกใช้fตอนนี้ลองCtrl+ Cมันไม่ถูกดักจับ!

วิธีการตั้งค่าtrapในฟังก์ชั่นทุบตี?

  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
คุณอาจจะใส่ในตอนท้ายของรหัสของคุณและลบจากพื้นที่ที่f f ()
GWF

คำตอบ:


7

นั่นเป็นเพราะมันส่ง SIGINT ไปยังกระบวนการในเบื้องหน้าแทนที่จะเป็นbash(ซึ่งกำลังเรียกใช้สคริปต์) หากคุณต้องการทำสิ่งนี้ให้ทำฟังก์ชั่นแบบอะซิงโครนัสแล้วใช้wait(ซึ่งจะทำหน้าที่ตามที่คาดไว้และใช้กับดัก)


มันเป็นงาน แต่ฉันพบว่าถ้าfอยู่ในท่อecho 123 | fแล้วมันไม่ดักหรือไม่
เฉิง

@Cheng ใช้ subshell (และไปป์ในกรณีนี้ไม่จำเป็นต่อไปเพียงแค่ใช้ heredoc / herestring) (command | command) &
Chris Down

1

Protip: ส่งกระบวนการพื้นหน้า QUIT ด้วยCtrl- \เมื่อCtrl- C, - Z, - Dไม่ทำงาน

ล้างกับดักเมื่อสิ้นสุดการประมวลผลด้วย trap - list of signals here

สนุกกับระบบที่ไม่ใช้งานจริง: ลองตั้งกับดักสำหรับสัญญาณที่เหมาะสมทั้งหมด (เช่นไม่ใช่ KILL) kill -l(ไม่ใช่ตัวพิมพ์เล็ก L ไม่ใช่หมายเลข 1 หรือไปป์ |)


0

ฉันคิดว่าคุณควรทำให้ฟังก์ชั่นทั่วโลก

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

INTและSIGINTมีความหมายเหมือนกัน - มันจะไม่สร้างความแตกต่าง
Chris Down
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.