这很有效:
$./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 "$@"
答案 0 :(得分:0)
shell终止时会触发EXIT
陷阱。当您查看./tailx.sh
时,您会更容易理解。正在运行的shell将其扩展为$SHELL $PWD/tailx.sh ...
。这意味着创建了一个新的shell进程(例如,子shell)。
EXIT
在此子进程终止时触发。
如果您source
脚本,则陷阱会附加到当前shell,因此当您关闭终端窗口或注销时它将被执行。