如果全部都要重定向的话每一条命令后面>>并不方便,可以这么做。
在开头就声明

exec 1>>$log_file
表示将脚本中所有的正确输出全部追加到$log_file,错误信息会输出到stdout。
如果想把错误信息也输出到$log_file,那么只需要补一句

exec 2 >> $log_file
就可以了

利用script命令记录下会话过程 
在Unix系统维护中,有时候系统工程师希望能够记录下会话的过程。如在测试一个系统功能的时候,工程师就希望将测试的步骤都一一的纪录下来。以便出现问 题时利用这份资料进行追踪分析。如有时候在制作培训文档的时候,可能也需要这些会话记录,以方便培训师制作PPT等培训文档。总之就是一句话,系统工程师 现在想要记录某个会话的过程,在Unix系统中能否实现? 首先当系统工程师想要记录某个会话的时候,则只需要在会话开始时输入script命令。输入这个命令后,系统就会将当前用户的所有键盘操作、屏幕输出以及 错误信息等等保存到一个特定的文件中。如上面执行了ps命令与who命令后,希望就会将这两个命令(用户的键盘操作)、屏幕输出(命令的执行结果)等等保 存到文件中。当工程师需要退出记录过程时,则只需要输入exit命令,系统就会就是script done的提示信息。表示系统已经结束了记录工作。 三、将正确信息与错误信息都保存在同一个文件中。 
除了可以将正确信息与错误信息保存在不同的文件中,还可以将它们合并在同一个文件中。要实现这个需求,可以采取两种途径。 
    一是通过文件合并来实现。即先将错误信息与正确信息保存在两个不同的文件中。然后再需要的时候,来利用文件合并的功能将他们合并在同一个文件中。如利 用cat命令加上>>重定向符号就可以将两个文件合并在一起了。注意这里用的是>>符号而不是>符号。这个命令很容易理 解,就是先将某个文件中(如保存错误信息的文件)的内容读出来,然后再通过重定向符号>>(这个符号的含义是追加,而不是替换)将读出来的错 误信息追加到另外一个文件中(如保存正确信息的文件)。通过这个方式就可以两正确信息与错误信息合并保存在同一文件中。

    二是通过&联合符号来实现这个需求。既然系统将输出分为标准输出流与错误输出流,那么系统管理员能否把这两个流合并在一起呢?答案是肯定的。 如果系统管理员需要将他们进行合并,则可以利用命令cat >file 1&2来完成。这个命令的含义就是将标准输出流(参数1表示)与错误输出流(参数2表示)的输出合并在一起,然后通过重定向符号保存在管理员指定 的文件中。 今天调试一个bash,要把屏幕的输出结果存到log文件中,开始输入 $bash -x ./test.sh > log 结果发现log里只存放了程序的执行结果,后来在cu的一篇帖子里http://bbs.chinaunix.net /viewthread.php?tid=264380&highlight=bash得到了启发, bash -x的调试信息是输出到2号流中的,所以解决方案为 bash -x ./test.sh 2>&1 | tee log 想起以前要存放执行make的结果时也遇到类似问题,总结如下: 
1、管道符的" | "的作用只是把前一个程序的标准输出流(stdout)的数据 作为后一个程序 的标准输入流stdin的数据,如不进行重定向,则其他输出流的信息是无法传给后面的程序的 
2、屏幕得到的信息不一定是从程序的标准输出来的,也包括标准错误输出流stderr中的信息 
3、有些程序(特别是象bash 、make这样执行了其他程序的程序)的设计者为了省事,把一些正常情况的信息也放在stderr中输出(即使程序本身并无错误),而stdout用来输 出被调用程序的执行时信息,造成了用户的误解 简单编写了一下脚本,通过ssh登陆在命令行下运行正常,可是将脚本添加到crontab中就不正常。想记录一下输出信息,分析一下错误原因。 将脚本通过使用 > info.log 重定向输出,结果发现一些在命令行下可以看到的文本信息没有记录到 info.log 文件中,研究了一下,那些输出估计是输出到了标准错误上。

研究了一下通常添加命令后面几个输出含义 
■>/dev/null 输出到空设备,表示丢掉输出信息。 
■2 > &1 将输出到标准错误的信息输出到标准输出设备(通常是屏幕) 有3个默认的i/o, 
■0 是标准输入,一般是键盘 
■1 是标准输出,一般是屏幕了 
■2 是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了

在编写稍微复杂的Shell脚本时,我们常常需要将标准输出和标准错误信息记录下来,以往我们通过如下形式办到:
 somescript.sh > log 2>&1

但这对规范的shell是不太完美的,一是log文件的位置及名称,只能由着执行者来定,存在不确定性;二是执行者是否记得使用这样的句式来确保操作显示 有记录,也无法保证
所以,我们需要在shell脚本内部指定,不受执行者影响而记录下显示输出的手段,而且,我们还不能用愚蠢的每句后面来一个| tee $logfile的方式

以下为实现方法,以Korn Shell为准: 
变量: logfile - 所有信息输出的文件 
fifofile - 为同时输出到屏幕和文件所建立的管道文件 
Shell内部可以支持的重定向标准输出和标准错误设备的基本方法: exec 1>$logfile exec 2>&1 
但是,这样就只能将所有信息输出到$logfile,无法实现同时显示在屏幕的目的。
不可能有exec 1>|tee $logfile的用法 
以往,在命令行将错误输出也导向屏幕及文件的方法是: somescript.sh 2>&1 | tee $logfile 这里用到管道,而exec命令并不支持管道用法,所以我们需要建立fifo文件来完成

但是,fifo管道文件是阻塞形管道,没有随时将其内容输出的话,脚本将hang住无法继续,所以我们要用“cat 管道文件”的方式将其随时导出,为了不影响后续命令执行,cat这一句必须放到后台。因为cat管道文件内容的时候,永远不会结束,因为不会遇到EOF标 记(就是控制字符Ctrl-D),除非在管道中出现了Ctrl-D,所以我们在脚本最后需要显示一个Ctrl-D,比较方便的方法是print "\015"(015是8进制,换算成10进制就是13,即Ctrl-D的ASCII码) 最后写法:

test.sh 
logfile=test.log 
fifofile=test.fifo 
mkfifo $fifofile 
cat $fifofile | tee $logfile & exec 1>$fifofile exec 2>&1

# some commands to produce normal and error output cal badcommand to generate stderr messages 
# print "\015" 
复制代码 运行结果: 
[root@system:/tt] sh test.sh October 2008 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 test.sh[12]: badcommand: not found. 
[root@system:/tt] cat test.log October 2008 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 test.sh[12]: badcommand: not found. [root@system:/tt]

【转】从Shell脚本内部将所有标准输出及标准错误显示在屏幕并同时写入文件的方法的更多相关文章

  1. Shell标准输出、标准错误

    shell中可能经常能看到:>/dev/null 2>&1 eg:sudo kill -9 ps -elf |grep -v grep|grep $1|awk '{print $4 ...

  2. Shell标准输出、标准错误 >/dev/null 2>&1

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  3. sort命令与cat区别25.1 由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile [root@shiyan a]# cat a.txt aaaaaa [root@shiyan a]# sort a.txt >c.txt ------------- 在重定向前会自动创建c.txt这个文件。 [root@shiyan

    25.1 由于sort默认是把结果按照行排序后输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile[root@shiyan a]# cat a. ...

  4. java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println和System.err.println的区别 Java重定向System.out和System.err

    本文关键词: java 标准输出与标准错误    out与 err 区别 用法 联系  java中的out与err区别  System.out和System.err的区别 System.out.pri ...

  5. linux将标准输出和标准错误输出都重定向到一个文件?

    需求描述: 今天在写crontab,里面有标准输出和错误输出,之前使用的是 > /dev/null 2>&1 那这个意思也就等同于将标准输出和错误输出都输出到/dev/null中, ...

  6. 文件IO详解(四)---标准输入、标准输出和标准错误

    每个进程都会默认打开3个文件描述符,即0.1.2.其中0代表标准输入流.1代表标准输出流.2代表标准错误流.通常标准输入流对应着键盘的设备文件.标准输出流和错误流对应着显示器的设备文件.在编程中通常使 ...

  7. 7、pytest -- 捕获标准输出和标准错误输出

    目录 1. 标准输出/标准错误输出/标准输入的默认捕获行为 2. 修改和去使能捕获行为 2.1. 文件描述符级别的捕获行为(默认) 2.2. sys级别的捕获行为 2.3. 去使能捕获行为 3. 使用 ...

  8. Pytest权威教程09-捕获标准输出及标准错误输出

    目录 捕获标准输出及标准错误输出 默认 stdout/stderr/stdin 捕获行为 设置捕获方法或禁用捕获 调试中使用print语句 在测试用例中使用的捕获的输出 返回: Pytest权威教程 ...

  9. Bash基础——Shell脚本内部常用环境变量

    $@和$*区别 不加引号的时候没区别 #! /usr/bin/bash function print_args_at { printf "%s\n" $@ echo $@ } fu ...

随机推荐

  1. Centos7 用yum命令安装LAMP环境(php+Apache+Mysql)以及php扩展

    1.yum -y update    // 更新系统 1.1)yum -y install gcc g++ gcc-c++ make kernel-devel kernel-headers 1.2)v ...

  2. webstorm使用过程中的一些问题与技巧

    这一篇会随着使用逐渐更新: 1. 问题:string templates are not supported by current javascript version 解决 : setting &g ...

  3. css+div页面布局

    div标签是html页面中用于分组的块元素,是专门用于元素布局的标签. 标签的级别: 1.行级标签:可设置大小,但一行只能容下一个行级标签(默认宽度==页面宽度,默认高度==填充高度) 2.块级标签: ...

  4. rsync 故障排查整理

    Rsync服务常见问题汇总 ================================================================== 1 客户端的错误现象:No route ...

  5. orcl创建数据库

    1.首先先创建一个文件夹存放数据库目录:d:cs        用户及密码为cs 2.创建表空间: create tablespace csdatafile 'O:\cs\cs.dbf' size 5 ...

  6. C Programming vs. Java Programming

    Thing C Java type of language function oriented object oriented basic programming unit function clas ...

  7. Linux nmap命令详解

    nmap,也就是Network Mapper,是Linux下的网络扫描和嗅探工具包. nmap是在网络安全渗透测试中经常会用到的强大的扫描器.功能之强大,不言而喻.下面介绍一下它的几种扫描命令.具体的 ...

  8. 4星|《门口的野蛮人2》:美国宝万之争专业户KKR公司的疯狂借债收购史

    门口的野蛮人2:KKR与资本暴利的崛起(珍藏版) 英文版是1992年出的.主要内容是1977-1998年之间KKR在美国的杠杆收购简史.从KKR创立开始,讲到1990年KKR差点倒闭.国内A股市场上前 ...

  9. ASCII码查看

    字母对照表: ASCII可显示字符: ASCII控制字符:

  10. 【Nginx】开启 gzip和缓存

    Nginx 开启 gzip和缓存 时间:2016-09-23 16:42:37 nginx 是一个高性能的 Web 服务器,之前也写过一些关于 nginx 的文章.为了提高博客的响应速度,可以从设置 ...