为了账号安全,请及时绑定邮箱和手机立即绑定

将stdout的COPY重定向到bash脚本本身的日志文件

将stdout的COPY重定向到bash脚本本身的日志文件

函数式编程 2019-08-23 16:01:31
将stdout的COPY重定向到bash脚本本身的日志文件我知道如何将stdout重定向到文件:exec > foo.log echo test这会将'test'放入foo.log文件中。现在我想将输出重定向到日志文件并将其保存在stdout上即它可以从脚本外部轻松完成:script | tee foo.log但我想在脚本本身内声明它我试过了exec | tee foo.log但它不起作用。
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

busybox,macOS bash和非bash shell的解决方案


接受的答案肯定是bash的最佳选择。我在没有访问bash的Busybox环境中工作,并且它不理解exec > >(tee log.txt)语法。它也无法exec >$PIPE正常工作,尝试创建一个与命名管道同名的普通文件,该文件失败并挂起。


希望这对没有bash的其他人有用。


此外,对于使用命名管道的任何人来说,它是安全的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


查看完整回答
反对 回复 2019-08-23
  • 3 回答
  • 0 关注
  • 590 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信