如何在bash函数中设置陷阱?


13

我可以trap在bash脚本中设置,但不能在bash函数中设置。

例如,source下面的代码run f,现在尝试Ctrl+ C,它没有被捕获!

如何trap在bash函数中设置?

  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

Answers:


7

这是因为它将SIGINT发送到前台的进程,而不是发送到bash(正在运行脚本的)进程。如果要执行此操作,请使该函数异步,然后使用wait(将按预期方式使用并使用陷阱)。


这样的作品。但是我发现,如果f在管道中echo 123 | f,那么它不是陷阱吗?

@Cheng使用一个子外壳程序(在这种情况下,不需要管道,只需使用heredoc / herestring)。(command | command) &
克里斯·

1

普罗蒂普:发送与前台进程戒烟Ctrl- \Ctrl- C,- Z,- D不工作。

在执行结束时清除陷阱 trap - list of signals here

在非生产系统上的乐趣:尝试为所有敏感信号设置陷阱(例如,非杀死)。 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是同义词-不会有任何区别。
克里斯·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.