我正在向 bash 脚本添加一些自定义日志记录功能,但无法弄清楚为什么它不会从一个命名管道获取输出并将其反馈回另一个命名管道。
这是脚本的基本版本 ( http://pastebin.com/RMt1FYPc ):
#!/bin/bash
PROGNAME=$(basename $(readlink -f $0))
LOG="$PROGNAME.log"
PIPE_LOG="$PROGNAME-$$-log"
PIPE_ECHO="$PROGNAME-$$-echo"
# program output to log file and optionally echo to screen (if $1 is "-e")
log () {
if [ "$1" = '-e' ]; then
shift
$@ > $PIPE_ECHO 2>&1
else
$@ > $PIPE_LOG 2>&1
fi
}
# create named pipes if not exist
if [[ ! -p $PIPE_LOG ]]; then
mkfifo -m 600 $PIPE_LOG
fi
if [[ ! -p $PIPE_ECHO ]]; then
mkfifo -m 600 $PIPE_ECHO
fi
# cat pipe data to log file
while read data; do
echo -e "$PROGNAME: $data" >> $LOG
done < $PIPE_LOG &
# cat pipe data to log file & echo output to screen
while read data; do
echo -e "$PROGNAME: $data"
log echo $data # this doesn't work
echo -e $data > $PIPE_LOG 2>&1 # and neither does this
echo -e "$PROGNAME: $data" >> $LOG # so I have to do this
done < $PIPE_ECHO &
# clean up temp files & pipes
clean_up () {
# remove named pipes
rm -f $PIPE_LOG
rm -f $PIPE_ECHO
}
#execute "clean_up" on exit
trap "clean_up" EXIT
log echo "Log File Only"
log -e echo "Echo & Log File"
我认为第 34 行和第 35 行的命令会获取$data
from$PIPE_ECHO
并将其输出到$PIPE_LOG
. 但是,它不起作用。相反,我必须将该输出直接发送到日志文件,而无需通过$PIPE_LOG
.
为什么这不像我预期的那样工作?
编辑:我将 shebang 更改为“bash”。不过,问题是一样的。
解决方案: AH 的回答帮助我了解我没有正确使用命名管道。从那以后,我什至不使用命名管道来解决我的问题。该解决方案在这里: http: //pastebin.com/VFLjZpC3