• Linux 标准文件描述符


    出于特殊目的,bash shell保留了最早的3个文件描述符0、1、2,如下所示:

    1、STDIN标准输入

    Shell从STDIN文件描述对应的键盘获得输入,在用户输入时处理每个字符。

    范例1cat命令处理STDIN输入的数据,输入一个就显示一个,按ctrl+c即可结束。

    [root@cloucentos6 home]# cat    

    my

    my

    name

    name

    is

    is

    TOM

    TOM

    范例2使用输入重定向符号 < 时,Linux会重写向指定的文件来替换文字的输入文件描述符。

    [root@cloucentos6 home]# cat file

    my name is Tom.

    [root@cloucentos6 home]# cat < file

    my name is Tom.

    2、STDOUT标准输出

    shell所有的输出(包括shell中运行的程序和脚本)会被定向到标准输出中,就是在终端上显示出来。

    范例1使用输出重定向 > 来改变输出。

    [root@cloucentos6 home]# ls -l > file

    [root@cloucentos6 home]# cat file

    总用量 20

    -rw-r--r--. 1 root root     0  6月 24 07:37 file

    drwx------. 2 root root 16384 12月 21 2016 lost+found

    -rwx------. 1 root root    81  6月 23 23:32 test.sh

    范例2使用输出重写向 >> 可以追加某个文件。

    [root@cloucentos6 home]# ls -l >> file

    [root@cloucentos6 home]# cat file

    总用量 20

    -rw-r--r--. 1 root root     0  6月 24 07:37 file

    drwx------. 2 root root 16384 12月 21 2016 lost+found

    -rwx------. 1 root root    81  6月 23 23:32 test.sh

    总用量 24

    -rw-r--r--. 1 root root   171  6月 24 07:37 file

    drwx------. 2 root root 16384 12月 21 2016 lost+found

    -rwx------. 1 root root    81  6月 23 23:32 test.sh

    3、STDERR标准错误

    shell运行程序和脚本出错时生成的错误消息都会发送到这个位置。

    范例1只重定向错误,STERR文件描述符被设成2,ls 查看一个/home目录不存在的文件将错误输出到file文件,屏幕上不会显示错误。

    [root@cloucentos6 home]# ls  -l  test4  2>file  

    [root@cloucentos6 home]# cat file

    ls: 无法访问test4: 没有那个文件或目录

    范例2重写向错误和数据,如果想重写向错误和正常输出,必须用两个重写向符号。STDOUT文件描述符被设为1,STERR文件描述符被设成2。

    [root@cloucentos6 home]# ls

    lost+found  test.sh

    [root@cloucentos6 home]# ls -l test.sh test4 2>file1 1>file2

    [root@cloucentos6 home]# ls

    file1  file2  lost+found  test.sh

    [root@cloucentos6 home]# cat file1

    ls: 无法访问test4: 没有那个文件或目录

    [root@cloucentos6 home]# cat file2

    -rwx------. 1 root root 81  6月 23 23:32 test.sh

    范例3假如把STDERR和STDOUT输出重定向到同一个文件file中,bash shell提供了一个特殊的重定向符号 &>

    [root@cloucentos6 home]# ls

    lost+found  test.sh

    [root@cloucentos6 home]# ls -l test.sh test2 &>file

    [root@cloucentos6 home]# cat file

    ls: 无法访问test2: 没有那个文件或目录

    -rwx------. 1 root root 81  6月 23 23:32 test.sh

    4、在脚本中重写向输出

    范例1在脚本中临时指定某行重定向输出标准错误和标准

    [root@cloucentos6 home]# cat test.sh

    #!/bin/bash

    bit=`arch`

    echo "hello ! world~!"

    echo "系统位数 $bit" >&2

    ipocnfig >&2

    [root@cloucentos6 home]# ./test.sh 2>out

    hello ! world~!

    [root@cloucentos6 home]# cat out

    系统位数 x86_64

    ./test.sh: line 5: ipocnfig: command not found

    范例2永久重定向输出脚本中所有标准错误

    [root@cloucentos6 home]# cat test.sh

    #!/bin/bash

    exec 2>/home/out

    bit=`arch`

    echo "hello ! world~!"

    echo "系统位数 $bit"

    ipocnfig

    [root@cloucentos6 home]# ./test.sh

    hello ! world~!

    系统位数 x86_64

    [root@cloucentos6 home]# cat out

    ./test.sh: line 7: ipocnfig: command not found

    范例3永久重定向输出脚本中所有标准错误和标准输出

    [root@cloucentos6 home]# cat test.sh

    #!/bin/bash

    exec &>/home/out

    bit=`arch`

    echo "hello ! world~!"

    echo "系统位数 $bit"

    ipocnfig

    [root@cloucentos6 home]# ./test.sh

    [root@cloucentos6 home]# cat out

    hello ! world~!

    系统位数 x86_64

    ./test.sh: line 7: ipocnfig: command not found

    5、阻止命令输出

    如果你想shell脚本后台运行输出所有的信息都要丢掉,不想显示出来,可以把Shell重定向到一个称作null文件的特殊文件,只要输出到null文件的任何数据都不会保存,这样所有的输出都会被丢掉。

    范例1Linux系统上的null文件的标准位置是/dev/null,你重定向到该位置的任何数据都会被丢掉,不会显示:

    [root@cloucentos6 home]# ls -l > /dev/null

    [root@cloucentos6 home]# cat /dev/null

    范例2阻止任何错误消息而不保存它们的一个通用方法

    [root@cloucentos6 home]# ls -al test4.txt test.sh 2>/dev/null

    -rwx------. 1 root root 98  6月 26 19:09 test.sh

    范例3由于/dev/null文件不含有任何内容,重定向输入将/dev/null作为输入文件,可以使用它快速清空现有文件中的所有数据,不用先删除文件再创建。

    [root@cloucentos6 home]# cat out

    hello ! world~!

    [root@cloucentos6 home]# cat /dev/null > /home/out

    [root@cloucentos6 home]# cat out

    6、记录消息

    tee命令相当于管道的一个T型接头,可以从标准输入过来的数据同时发给两个上的地。一个目的地是标准输出,另一个目的地是tee命令行所指定的文件名。

    范例1tee将从STDIN过来的数据重定向。

    [root@cloucentos6 home]# date | tee out

    2017年 06月 27日 星期二 00:18:28 CST

    [root@cloucentos6 home]# cat out

    2017年 06月 27日 星期二 00:18:28 CST

    范例2默认情况下,tee命令会在每次使用时覆盖输出文件,如果想将数据追加到文件中,必须使用 – a  选项。

    [root@cloucentos6 home]# cat out

    2017年 06月 27日 星期二 00:18:28 CST

    root@cloucentos6 home]# who | tee -a out

    root     pts/0        2017-06-27 00:14 (10.8.9.11)

    [root@cloucentos6 home]# cat out

    2017年 06月 27日 星期二 00:18:28 CST

    root     pts/0        2017-06-27 00:14 (10.8.9.11)

    [root@cloucentos6 home]# arch | tee out

    x86_64

    [root@cloucentos6 home]# cat out

    x86_64

    范例3脚本中把数据保存到文件中,也能把数据显示在屏幕上(但tee命令输出的错误信息不会保存在文件中)。

    [root@cloucentos6 home]# cat test.sh

    #!/bin/bash

    bit=`arch`

    echo "hello ! world~!" | tee out

    echo "系统位数 $bit" | tee -a out

    ipocnfig | tee -a out

    [root@cloucentos6 home]# ./test.sh

    hello ! world~!

    系统位数 x86_64

    ./test.sh: line 5: ipocnfig: command not found

    [root@cloucentos6 home]# cat out

    hello ! world~!

    系统位数 x86_64

  • 相关阅读:
    javascript金额千分位的实现
    html中仿GroupBox效果与路径问题
    javascript获取表格的高度
    分布式系统的架构思路
    sharepoint2010 Reporting Services 集成注意
    Ext.MessageBox.updateProgress
    认识RFID
    Extjs 下拉ComboBox分页,图片,多行显示
    MVCFckEditor一些小问题
    MVCFckEditor
  • 原文地址:https://www.cnblogs.com/zoulongbin/p/7080324.html
Copyright © 2020-2023  润新知