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

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]

最新文章

  1. 检测cpu是否支持虚拟化和二级地址转换【转】
  2. ionic 通过PouchDB + SQLite来实现app的本地存储(Local Storage)
  3. BZOJ 4551: [Tjoi2016&Heoi2016]树
  4. LR 常见问题收集及总结
  5. LeetCode(9) - Palindrome Number
  6. NodeJS学习之网络操作
  7. html css中id和class的区别比较
  8. Android经验之谈1
  9. 美国TJX公司 - MBA智库百科
  10. C++ 元编程 —— 让编译器帮你写程序
  11. 【LeetCode】数组-3(605)-种花问题( 1 的两侧不能有 1 )
  12. 怎么调用api接口
  13. django-debug-toolbar的配置以及使用
  14. Git实际使用
  15. Shell命令-线上查询及帮助之man、help
  16. nohup后台执行
  17. python 列表和元组
  18. WPF中播放声音媒体文件
  19. STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式
  20. android矩阵具体解释

热门文章

  1. C#中使用反射遍历一个对象属性和值以及百分数
  2. 试试SQLServer 2014的内存优化表(转载)
  3. 修改win下ras/pppoe/l2tp等连接数限制
  4. python第三十课--异常(else讲解)
  5. [POI2007]MEG-Megalopolis
  6. CF838D Airplane Arrangements
  7. java中Integer与int装箱拆箱一点收获
  8. CentOS常用命令备忘
  9. Drool实战系列(二)之eclipse安装drools插件
  10. scrt中使用alt键