1

这很好用:

$./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 "$@"
4

1 回答 1

0

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

EXIT当这个子进程终止时触发。

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

于 2014-10-03T12:08:11.227 回答