bash 스크립트에 사용자 정의 로깅 기능을 추가했는데, 하나의 명명 된 파이프에서 출력을 가져 와서 다른 명명 된 파이프로 다시 공급하지 않는 이유를 알 수 없습니다. $PIPE_LOG
에 하나의 명명 된 파이프에서 다른 명명 된 파이프로 다시 출력 할 수 있습니까?
#!/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
[email protected] > $PIPE_ECHO 2>&1
else
[email protected] > $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 에서
$data
을 할 줄에 명령을 생각 출력이 : 여기
은 기본 스크립트 버전 (
http://pastebin.com/RMt1FYPc)입니다. 하지만 작동하지 않습니다. 대신 출력을
$PIPE_LOG
을 거치지 않고 직접 로그 파일로 보내야합니다.
내가 예상 한대로 작동하지 않는 이유는 무엇입니까?
편집 : 나는 "bash"로 shebang을 변경했습니다. 그러나 문제는 동일합니다.
해결 방법 : A.H.'s answer은 명명 된 파이프를 올바르게 사용하지 않는다는 것을 알았습니다. 이후로 명명 된 파이프를 사용하지 않아서 문제가 해결되었습니다. 그 해결책은 여기에 있습니다 : http://pastebin.com/VFLjZpC3
당신은 bash 스크립트라고 말하면서 스크립트의 첫번째 줄에'/ bin/sh'를 지정하고 있습니다. bash에서이 작업을 수행해야하는지 확실합니까? bash는 기본적으로 모든 운영 체제에 설치되지 않습니다. – ghoti
잠재적 인 문제는이 스크립트를 bash [경로] 대신 경로를 사용하여 실행하면 bash의 "sh"버전을 호출한다는 것입니다 (동일한 실행 파일 일지라도). 작동하지 않습니다. 정확히 같은 (제한). – huelbois
"sh"를 "bash"로 바꾸려고 시도했지만 같은 방식으로 작동합니다 (즉, 그렇지 않습니다). – kipkoan