为什么陷阱信号在Shell函数中不起作用?

时间:2014-10-03 11:07:00

标签: bash function shell bash-trap

这很有效:

$./tailx.sh error.log 10.21.xxx.xxx # /tmp/.log.pipe is removed

但执行时不会删除/tmp/.log.pipe:

$source tailx.sh
$tailx error.log 10.21.xxx.xxx # /tmp/.log.pipe is not removed 

我想知道原因和方法?

这是我的代码。我用它来远程登录远程机器。

#!/bin/bash
# tailx error.log hostname
function tailx {

  [ $# -lt 2 ] && echo "Invalid input" && return
  # do clean,
  local LOG_PIPE=/tmp/.log.pipe
  local LOG_FILE=$1
  trap 'echo Exting..... >&2 && [ -e $LOG_PIPE ] && rm $LOG_PIPE ' EXIT
  # fix path
  [ / != ${LOG_FILE:0:1} ] && LOG_FILE=`pwd`"/"$LOG_FILE

  [ -e $LOG_PIPE ] || mkfifo $LOG_PIPE

  # iterate host, tail log
  shift
  until [ $# -eq 0 ]
  do
    ssh $1 "tail -f $LOG_FILE | awk 'BEGIN{\"hostname\"|getline HOST; } {print HOST, \$0}'" > $LOG_PIPE &
    shift
  done

  cat $LOG_PIPE

}

tailx "$@"

1 个答案:

答案 0 :(得分:0)

shell终止时会触发EXIT陷阱。当您查看./tailx.sh时,您会更容易理解。正在运行的shell将其扩展为$SHELL $PWD/tailx.sh ...。这意味着创建了一个新的shell进程(例如,子shell)。

EXIT在此子进程终止时触发。

如果您source脚本,则陷阱会附加到当前shell,因此当您关闭终端窗口或注销时它将被执行。