以下是该脚本的基本版本(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行的命令会将
$PIPE_ECHO
中的$data
输出到$PIPE_LOG
,但它不起作用。相反,我必须直接将输出发送到日志文件,而不通过$PIPE_LOG
。为什么它不能按照我的期望工作?
编辑:我将shebang更改为“bash”。问题仍然存在。
解决方案:A.H.的答案帮助我了解我没有正确使用命名管道。我已经通过不使用命名管道来解决了我的问题。该解决方案在这里:http://pastebin.com/VFLjZpC3
/bin/sh
。你确定在bash中需要这样做吗?请记住,bash并不是每个操作系统都默认安装的。 - ghoti./<script_name>
调用脚本。在RHEL/CentOS中,/bin/sh
是符号链接到/bin/bash
的。但是,如果您使用bash来运行它,我想它应该与CentOS上的bash一样工作。 - kipkoan