将所有命令stdout / stderr从脚本中重定向到日志文件

时间:2011-03-15 19:40:48

标签: linux bash redirect stdout stderr

我已经阅读了如何单独记录某些脚本或命令,但没有介绍如何从BASH shell中记录所有命令。我想做的是:

  • 用户运行脚本。 (脚本从现在开始将stdout / stderr记录到日志文件中)
  • 用户执行其他操作/运行其他命令/回声/等等,所有这些都记录在日志文件中。

一个不那么冗长/更具代码性的例子:

exec> >(tee logfile.log)当用户输入时完全符合我的要求。它将stdout记录到logfile.log,并将继续这样做,直到关闭bash shell。但是,将此命令作为脚本运行不会执行此操作。我想要它。

4 个答案:

答案 0 :(得分:5)

您不能在自己的shell下运行的脚本中执行此操作(即,它以#!/bin/bashchmod +x开头,并像可执行文件一样调用它。重定向会影响子shell,但它无法到达父级以执行您想要的操作。您可以.文件(如在. ./myscript.sh中)执行shell中命令,然后您可以根据需要重定向。

另一种方法是让你的脚本自己启动一个子shell(它将继承stdin,stdout,stderr)。这就是script命令的作用。它会将所有内容记录到名为(默认情况下)typescript的文件中,直到用户退出子shell。

答案 1 :(得分:1)

$ bash | tee /tmp/logs/logfile.txt

$ ls / tmp / logs

LOGFILE.TXT

$< CTRL-d取代;

出口

$ cat /tmp/logs/logfile.txt

LOGFILE.TXT


如果你正在寻找stdout,那么这似乎有效。如果你想要stdin / stdout,那么脚本就像前面提到的那样。

答案 2 :(得分:0)

别名怎么样?

alias Start-Script='script logfile.txt'

答案 3 :(得分:0)

仅供参考,如果有人想这样做以启动守护进程(后台进程),我建议您查看优秀的daemonize

daemonize允许您从某个目录(没有cd)启动进程,重定向stdout,重定向stderr,编写pidfile或lockfile,以及以某个用户身份运行。这非常有用,例如。在编写自己的小init脚本时。

来自man page的概要最能说明它非常直接的用法:

daemonize [-a] [-c directory] [-e stderr] [-o stdout] [-p pidfile] [-l lockfile] [-u user] [-v] path [arg] ...