โซลูชันสำหรับ busybox, macOS bash, และ non-bash shells
คำตอบที่ยอมรับนั้นเป็นตัวเลือกที่ดีที่สุดสำหรับการทุบตี ฉันทำงานในสภาพแวดล้อม Busybox โดยไม่ต้องเข้าถึง bash และไม่เข้าใจexec > >(tee log.txt)
ไวยากรณ์ นอกจากนี้ยังทำไม่exec >$PIPE
ถูกต้องพยายามสร้างไฟล์ธรรมดาที่มีชื่อเดียวกันกับไพพ์ที่มีชื่อซึ่งล้มเหลวและหยุดทำงาน
หวังว่านี่จะเป็นประโยชน์กับคนที่ไม่มีทุบตี
นอกจากนี้สำหรับทุกคนที่ใช้ไพพ์ที่มีชื่อก็ปลอดภัยที่จะ rm $PIPE
ไพพ์ที่เพราะนั่นจะยกเลิกการเชื่อมโยงไพพ์จาก VFS แต่กระบวนการที่ใช้ยังคงรักษาจำนวนการอ้างอิงไว้จนกว่าจะเสร็จสิ้น
โปรดทราบว่าการใช้ $ * อาจไม่ปลอดภัย
#!/bin/sh
if [ "$SELF_LOGGING" != "1" ]
then
# The parent process will enter this branch and set up logging
# Create a named piped for logging the child's output
PIPE=tmp.fifo
mkfifo $PIPE
# Launch the child process with stdout redirected to the named pipe
SELF_LOGGING=1 sh $0 $* >$PIPE &
# Save PID of child process
PID=$!
# Launch tee in a separate process
tee logfile <$PIPE &
# Unlink $PIPE because the parent process no longer needs it
rm $PIPE
# Wait for child process, which is running the rest of this script
wait $PID
# Return the error code from the child process
exit $?
fi
# The rest of the script goes here