• Linux中的输入输出重定向


     

    有三个最重要的输入输出流:标准输入(stdin),标准输出(stdout),标准错误(stderr)。它们对于控制台(控制台指的是键盘用于输入,屏幕用于输出)来说是缺省的,但是它们可以被重定向。

     

    重定向标准输出:可以使用“>”符号,

    举例:

      dir my_dir > filelisting.txt                      

    将把 dir 命令的标准屏幕输出重定向到文本文件 filelisting.txt 文件里,所以屏幕上没有任何输出。这个文件可以用来编辑(比如使用 pico 文本编辑器)或者合并到其他的文件里。

     

    重定向标准错误:可以使用结构“2>”

    举例:

      dir my_dir 2> errorlisting.txt                    

    以上命令将送标准输出到屏幕上,如果没有错误信息,将没有任何信息写到 errorlisting.txt 文件里。如果出错,则没有什么东西输出到屏幕,而文件 errorlisting.txt 将包含错误信息。错误信息有可能是这样的:

      dir: my_dir:Permission denied                     

     

    不考虑标准输出正确与否都输入到同一个文件中:

    最后,我也可以把标准输出和标准错误一起输出到同一个文件里,

      dir my_dir > file_and_error_listing.txt 2>&1      

    以上命令先重定向标准输出到文本文件里,然后再重定向标准错误到和标准输出同样的位置。它如何实现可能看起来有点古怪,但是是可行的。

     

    追加重定向:

    在以上的例子里,如果重定向的文件已经存在,该文件会被覆盖。如果你要追加到该文件的末尾,可以使用“>>”符号,以上的例子就变成:

    dir my_dir >> filelisting.txt                        
    dir my_dir 2>> errorlisting.txt                      
    dir my_dir >> file_and_error_listing.txt 2 > &1      

    如果你对“2>”感到很迷惑,这里有一个简单的办法可以帮你理解,标准流有标准的解析器:“0”代表标准输入,“1”代表标准输出,“2”代表标准错误。

      dir my_dir > file.txt                            

    是以下命令的简写方式:

      dir my_dir 1 > file.txt                          

    那么以下命令就是用来输出标准错误:

      dir my_dir 2 > file.txt                          

     

    管道符:

    还有,你还可以使用符号“|”(管道命令)把一个命令的标准输出送到另外一个命令的标准输入。在以下这个标准的例子里,dir 命令的标准输出通过管道输入到命令 more 里(输出满屏的时候自动暂停):

      dir | more                                       

     

    同时实现标准输出与输入到文件:

    你还可以使用“tee”命令把标准输出同时写到文件和屏幕,

      dir | tee filelisting.txt                        

    tee “T型连接器的模拟音,在管道中的主要的用途是分流

     

    标准输入重定向:

    这个部分这样都用来讲述标准输出重定向,对于标准输入重定向不像标准输出重定向那么有用,但是它可以使用以下方式实现:

      cat < my_file                                    

     

    直接插入式的标准输出:

    还有一种叫做直接插入式的标准输出,可以通过“<<”来实现。不要管它了,看起来对我没有什么实际用处。不过,如果你真的想知道,这里有一个例子(这里“>”式第二个提示符)

       cat << my_marker                                
       > my_line_from_the_keyboard                     
       > another_line_from_the_keyboard                
       > my_marker                                     

     

    输出到其他设备:

    除了重定向到常规文件和过滤器之外(如以上的例子所示),你还可以重定向到设备和其他特殊文件。看下面这些例子。

    终端:

    重定向到设备文件的例子。以下命令将显示文件列表到第四个文本终端:

    dir > /dev/tty4                                      

    垃圾站:

       echo ‘hello’> /dev/null                        

    FIFO

    以下是一个重定向到一个特殊的 FIFO (先进先出)文件的例子。该命令送信息”you are lucky”到叫做“lucky” ICQ 用户 UIN 7777777 (假定你已经用你的 ICQ 程序连接到 ICQF 服务器上了)

      echo message 7777777 “you are lucky” < ~/.licq/licq_fifo

    以上的例子能够工作是因为在你 licq 目录下的文件“licq_fifo”是一个特别的 FIFO 序列文件。以上这个例子,对比于在图形用户界面下的 ICQ 程序有什么特别有用的地方吗?举个例子,你可以写一个短的脚本带上多个信息给你的那些 ICQ 伙伴们:

    #!/bin/bash
    echo Messaging UIN: $1 Message: $2 Times: $3
    # The next command puts puts your licq in the status "on-line
    invisible".
    echo 'status *online' > ~/.licq/licq_fifo
    c=0
    while [ $c -le $3]
    do
    echo message $1 $2 > ~/.licq/licq_fifo
    c=`expr $c + 1`
    echo $c " "
    done
    echo 'status offline' > ~/.licq/licq_fifo
    echo "all done"

     

    这个例子利用了 licq 通信模型 (FIFO文件)和简单的文件重定向功能,给你一个关于如何自动化”licq 的主意。

     

    ------------------------------------------------

     基础知识

    文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。常用的文件描述符如下:

    文件描述符

    名称

    常用缩写

    默认值

    0

    标准输入

    stdin

    键盘

    1

    标准输出

    stdout

    屏幕

    2

    标准错误输出

    stderr

    屏幕

    我们在简单地用<>时,相当于使用 0< 1>(下面会详细介绍)。

    管道“|”(pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;

    tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

    [编辑] 简单重定向

    ·                     cmd > file

    cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bashnoclobber选项可以防止覆盖原有文件。

    ·                     cmd >> file

    cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。

    ·                     cmd < file

    使cmd命令从file读入

    ·                     cmd << text

    从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。

    ·                     cmd <<< word

    word(而不是文件word)和后面的换行作为输入提供给cmd

    ·                     cmd <> file

    以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。

    ·                     cmd >| file

    功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。

    [编辑] 使用文件描述符的重定向

    使用文件描述符的重定向都使用了&符号。

    cmd >&n

    把输出送到文件描述符n

    cmd m>&n

    把输出 到文件符m的信息重定向到文件描述符n

    cmd >&-

    关闭标准输出

    cmd <&n

    输入来自文件描述符n

    cmd m<&n

    m来自文件描述各个n

    cmd <&-

    关闭标准输入

    cmd <&n-

    移动输入文件描述符n而非复制它。(需要解释)

    cmd >&n-

    移动输出文件描述符 n而非复制它。(需要解释)

    [编辑] 重定向的组合应用

    cmd 2>file

    把文件描述符2重定向到file,即把错误输出存到file中。

    cmd > file 2>&1

    把标准错误重定向到标准输出,再重定向到file,即stderrstdout都被输出到file

    cmd &> file

    功能与上一个相同,更为简便的写法。

    cmd >& file

    功能仍与上一个相同。

    cmd > f1 2>f2

    stdout重定向到f1,而把stderr重定向到f2

    tee files

    stdout原样输出的同时,复制一份到files中。

    tee files

    stderrstdout都输出到files中,同时输出到屏幕。

  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/buffer/p/1607074.html
Copyright © 2020-2023  润新知