2006-02-08 17:20:05 +08:00
|
|
|
|
|
|
|
function __trap_translate_signal
|
|
|
|
set upper (echo $argv[1]|tr a-z A-Z)
|
|
|
|
if expr $upper : 'SIG.*' >/dev/null
|
|
|
|
echo $upper | cut -c 4-
|
|
|
|
else
|
|
|
|
echo $upper
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function __trap_switch
|
|
|
|
|
|
|
|
switch $argv[1]
|
|
|
|
case EXIT
|
|
|
|
echo --on-exit %self
|
2010-09-18 10:18:26 +08:00
|
|
|
|
2006-02-08 17:20:05 +08:00
|
|
|
case '*'
|
|
|
|
echo --on-signal $argv[1]
|
2010-09-18 10:18:26 +08:00
|
|
|
end
|
2006-02-08 17:20:05 +08:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
function trap -d 'Perform an action when the shell recives a signal'
|
|
|
|
|
|
|
|
set -l mode
|
2010-09-18 10:18:26 +08:00
|
|
|
set -l cmd
|
|
|
|
set -l sig
|
2006-02-08 17:20:05 +08:00
|
|
|
set -l shortopt
|
|
|
|
set -l longopt
|
|
|
|
|
|
|
|
set -l shortopt -o lph
|
|
|
|
set -l longopt
|
|
|
|
if not getopt -T >/dev/null
|
|
|
|
set longopt -l print,help,list-signals
|
|
|
|
end
|
|
|
|
|
2010-11-05 23:26:26 +08:00
|
|
|
if not getopt -n type -Q $shortopt $longopt -- $argv >/dev/null
|
2006-02-08 17:20:05 +08:00
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
|
|
|
set -l tmp (getopt $shortopt $longopt -- $argv)
|
|
|
|
|
|
|
|
eval set opt $tmp
|
|
|
|
|
|
|
|
while count $opt >/dev/null
|
|
|
|
switch $opt[1]
|
|
|
|
case -h --help
|
2006-11-18 00:24:38 +08:00
|
|
|
__fish_print_help trap
|
2006-02-08 17:20:05 +08:00
|
|
|
return 0
|
2010-09-18 10:18:26 +08:00
|
|
|
|
2006-02-08 17:20:05 +08:00
|
|
|
case -p --print
|
|
|
|
set mode print
|
2010-09-18 10:18:26 +08:00
|
|
|
|
2006-02-08 17:20:05 +08:00
|
|
|
case -l --list-signals
|
|
|
|
set mode list
|
2010-09-18 10:18:26 +08:00
|
|
|
|
2006-02-08 17:20:05 +08:00
|
|
|
case --
|
|
|
|
set -e opt[1]
|
|
|
|
break
|
|
|
|
|
|
|
|
end
|
|
|
|
set -e opt[1]
|
|
|
|
end
|
|
|
|
|
|
|
|
if not count $mode >/dev/null
|
|
|
|
|
|
|
|
switch (count $opt)
|
|
|
|
|
|
|
|
case 0
|
|
|
|
set mode print
|
|
|
|
|
|
|
|
case 1
|
|
|
|
set mode clear
|
|
|
|
|
|
|
|
case '*'
|
|
|
|
if test opt[1] = -
|
|
|
|
set -e opt[1]
|
|
|
|
set mode clear
|
|
|
|
else
|
|
|
|
set mode set
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
switch $mode
|
|
|
|
case clear
|
|
|
|
for i in $opt
|
2006-12-13 02:18:41 +08:00
|
|
|
set sig (__trap_translate_signal $i)
|
2006-02-08 17:20:05 +08:00
|
|
|
if test $sig
|
2010-09-18 10:18:26 +08:00
|
|
|
functions -e __trap_handler_$sig
|
2006-02-08 17:20:05 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
case set
|
|
|
|
set -l cmd $opt[1]
|
|
|
|
set -e opt[1]
|
|
|
|
|
|
|
|
for i in $opt
|
|
|
|
|
2006-12-13 02:18:41 +08:00
|
|
|
set -l sig (__trap_translate_signal $i)
|
|
|
|
set sw (__trap_switch $sig)
|
2006-02-08 17:20:05 +08:00
|
|
|
|
|
|
|
if test $sig
|
|
|
|
eval "function __trap_handler_$sig $sw; $cmd; end"
|
|
|
|
else
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
case print
|
2010-09-18 10:18:26 +08:00
|
|
|
set -l names
|
2006-02-08 17:20:05 +08:00
|
|
|
|
|
|
|
if count $opt >/dev/null
|
2006-12-13 02:18:41 +08:00
|
|
|
set names $opt
|
2006-02-08 17:20:05 +08:00
|
|
|
else
|
2006-12-13 02:18:41 +08:00
|
|
|
set names (functions -na|sgrep "^__trap_handler_"|sed -e 's/__trap_handler_//' )
|
2006-02-08 17:20:05 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
for i in $names
|
|
|
|
|
2006-12-13 02:18:41 +08:00
|
|
|
set sig (__trap_translate_signal $i)
|
2006-02-08 17:20:05 +08:00
|
|
|
|
|
|
|
if test sig
|
|
|
|
functions __trap_handler_$i
|
|
|
|
else
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
case list
|
|
|
|
kill -l
|
2010-09-18 10:18:26 +08:00
|
|
|
|
2006-02-08 17:20:05 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|