SHELL脚本的基础知识5——显示数据

一、输入和输出

1、标准文件描述符

每个进程中最多可以有9个打开文件的描述符:0——stdin,1——stdout,2——stderr。

(1)STDIN

     对于终端,stdin就是键盘。

     使用输入重定向符号(<)时,就将使用重定向引用的文件替换标准的输入文件描述符。

(2)STDOUT

     对于终端,stdout就是显示器。

     使用输出重定向符号(>)时,就将使用重定向引用的文件替换标准的输出文件描述符。

     还可以使用>>,向文件追加数据。

(3)STDERR

     shell将错误提示信息与正常输出信息分开处理。默认情况下,stderr与stdout都是输出到显示器。

2、重定向错误

    有几种方法可以进行重定向数据

(1)仅重定向错误: 2> file   (2必须位于>的正前方,2与>之间不能有空格),此时标准输出不受影响,仍然输出到显示器

(2)重定向错误和数据:

       同时使用两个重定向输出到不同文件,2> file1, 1> file2

       输出到同一个文件:&> file

 

二、在脚本中重定向输出

    使用脚本重定向输出的方法有以下两种

1、临时重定向

    重定向到某个文件描述符,必须在编号前加&号。ex:  >&2 (>& 间无空格)

    然后当这个文件描述符对应的文件被重定向后,脚本对应的重定向输出内容也同样被重定向。

2、永久重定向

    可以使用exec命令通知shell在脚本执行期重定向特定的文件描述符

    ex: exec 1>testout

重定向stdout和stderr后,就无法轻松再重定向回原来文字,需要使用技巧(见下方)

 

三、在脚本中重定向输入

    同样使用exec即可,ex: exec 0< file

    对于读取文本数据并使用脚本处理,这是一个好方法。

 

四、创建自己的重定向

    除了0,1,2外,其他3-8都可以用于创建自己的重定向。

1、创建输出文件描述符

    同样是先使用 exec 3>test13out,再将某一行     ……… >&3

2、重定向文件描述符

   可以将stdout等的原位置重定向到备选文件描述符,然后将该文件描述符重定向回stdout。

   ex:  exec 3>&1

         exec 1>file

         ……

         exec 1>&3

   这是一种临时重定向脚本文件输出然后恢复回普通设置的常用方法

3、创建输入文件描述符

    使用上方同样的方法,可将stdin先保存,再定向,再恢复

ex:   exec 6<&0

       exec 0< testfile

       …………

       exec 0<&6

4、创建读取/写入文件描述符

     可以使用同一个文件描述符从一个文件读取数据,同时向这个文件写入数据: exec 3<> testfile

     内部将维护一个文件指针,指示内部的位置,读取和输入都将发生在指针上次所指的位置

5、关闭文件描述符

    使用&-进行关闭文件描述符,ex : exec 3>&- (之后就不可以再使用3了)

    如果再开同一文件,将覆盖之前数据

 

五、列出开放文件描述符

    使用lsof命令可以列出整个系统上开放的文件描述符。

    可以使用$$确定当前PID,ex: lsof -a -p $$ -d 0,1,2

   

六、禁止命令输出

  将stderr重定向到空文件(/dev/null),则输出的任何数据都不会保存,即全部丢失。

  使用 cat /dev/null > testfile 就可以快速将testfile中所有数据全部抹除

 

七、使用临时文件

   /tmp目录专门用于保存临时文件,每次开机时,/tmp下的文件都将自动删除。

   可以使用mktemp命令,在/tmp下创建一个唯一的临时文件

1、创建本地临时文件

   mktemp 文件名.xxxxxx 就可以在本地目录创建一个唯一的文件

   在脚本中使用mktemp命令,需要使用一个变量保存该文件名。

2、在/temp中创建临时文件

   使用mktemp -t就可以在/temp下创建临时文件,返回的是完整路径名

3、创建临时目录

   使用mktemp -d就可以在当前目录下创建临时目录

 

八、记录消息

   同时将消息发送到监视器和文件,就可以使用tee命令。

   ex: tee filename   将stdin的数据同时发送到stdout,和指定的文件filename

   可以与管道命令配置使用重定向任何命令的输出:ex: date | tee testfile  

   默认情况下,每次使用tee都将覆盖输出文件,使用-a就可以向文件添加数据

posted @ 2010-06-02 16:33  红脸书生  阅读(1628)  评论(0编辑  收藏  举报