zoukankan      html  css  js  c++  java
  • shell基础知识之 stdin,stdout,stderr和文件描述符

    stdin,stdout,stderr

    stdin=0
    stdout=1
    stderr=2

    使用tee来传递内容,把stdout 作为stdin 传到下个命令

    root@172-18-21-195:/tmp/pratice# echo "who is this" | tee -  # -相当于传入到stdout,所以打印2次
    who is this
    who is this
    root@172-18-21-195:/tmp/pratice# echo "who is this" | tee - | cat -n  # cat -n 是显示行数
         1	who is this
         2	who is this
    

    把stderr给导入指定地方

    root@172-18-21-195:/tmp/pratice# ls asdf out.txt 2>/dev/null  1>/dev/null  
    root@172-18-21-195:/tmp/pratice# ls asdf out.txt &>out.txt  # 可以简写成这样,也可以写成2>&1 这样,二选一
    root@172-18-21-195:/tmp/pratice# cat out.txt
    ls: cannot access asdf: No such file or directory
    out.txt
    
    
    1. 将文件重定向到命令

    借助小于号(<),我们可以像使用stdin那样从文件中读取数据:

    $ cmd < file 
    
    2. 重定向脚本内部的文本块

    可以将脚本中的文本重定向到文件。要想将一条警告信息添加到自动生成的文件顶部,可以
    使用下面的代码:

    root@172-18-21-195:/tmp/pratice# cat << EOF >log.txt
    > this is a test for log.txt
    > EOF
    root@172-18-21-195:/tmp/pratice# cat log.txt
    this is a test for log.txt
    

    出现在cat <log.txt与下一个EOF行之间的所有文本行都会被当作stdin数据。
    log.txt文件的内容显示如下:

    3. 自定义文件描述符

    文件描述符是一种用于访问文件的抽象指示器(abstract indicator)。存取文件离不开被称为
    “文件描述符”的特殊数字。 0 、 1 和 2 分别是 stdin 、 stdout 和 stderr 预留的描述符编号。
    exec 命令创建全新的文件描述符。如果你熟悉其他编程语言中的文件操作,那么应该对文
    件打开模式也不陌生。常用的打开模式有3种。

    1. 只读模式。
    2. 追加写入模式。
    3. 截断写入模式。
      < 操作符可以将文件读入 stdin 。 > 操作符用于截断模式的文件写入(数据在目标文件内容被
      截断之后写入)。 >> 操作符用于追加模式的文件写入(数据被追加到文件的现有内容之后,而且
      该目标文件中原有的内容不会丢失)。文件描述符可以用以上3种模式中的任意一种来创建。

    创建一个用于读取文件的文件描述符

    [root@dns-node2 tmp]# cat input.txt
    aaa
    bbb
    ccc
    
    [root@dns-node2 tmp]# exec 3<input.txt  # 创建一个新的描述符3, 3和<和input.txt之间千万不能有空格,必须紧挨着。
    [root@dns-node2 tmp]# cat <&3
    aaa
    bbb
    ccc
    

    如果要再次读取,我们就不能继续使用文件描述符 3 了,而是需要用 exec 重新创建一个新的
    文件描述符(可以是 4 )来从另一个文件中读取或是重新读取上一个文件。
    创建一个用于写入(截断模式)的文件描述符:

    [root@dns-node2 tmp]# exec 4>output.txt
    [root@dns-node2 tmp]# echo newline >&4  # &在这里可以理解为获取4这个FD的内存地址(个人理解,该理解来自go语言)
    [root@dns-node2 tmp]# cat output.txt
    newline
    

    追加模式

    [root@dns-node2 tmp]# exec 5>>input.txt
    [root@dns-node2 tmp]# echo Append line >&5
    [root@dns-node2 tmp]# cat input.txt
    aaa
    bbb
    ccc
    Append line
    
    
  • 相关阅读:
    【解决】Linux Tomcat启动慢Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds
    初学java总结
    第8周课程总结&实验报告6
    第9周总结&实验报告7
    实验报告5&第七周课程总结
    第五周课程总结、实验报告三
    第六周总结&实验报告四
    使用REST接口获取GeoServer中的图层列表
    网上最流行的FLASH焦点图文幻灯片(focus.swf改进版),可支持jpg/gif/png/swf文件(转载)
    使用PostgreSQL的bytea字段存读取文件及读取出错问题处理
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/11462202.html
Copyright © 2011-2022 走看看