zoukankan      html  css  js  c++  java
  • 学习笔记:CentOS 7学习之十一:文件的重定向


    1、文件描述符定义

    文件描述符:是内核为了高效管理已被而打开的文件所创建的缩影,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符:文件描述符是一个简单的非负整数,用于标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,以此类推。可以理解为是一个文件的身份ID。

    用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)也是一个文件

    Number Channel Description Default connection Usage 描述
    0 stdin standard input keyboard read only 默认设备:键盘,文件编号0
    1 stdout standard output Terminal write only 默认设备:显示器,文件编号1,可重新定向到文件
    2 stuerr standard error Terminal write only 默认设备:显示器,文件编号2,可重新定向到文件
    3+ filename other files none read and/or write

    举例:

    1)查看一个进程打开了那些文件

    ll /proc/进程ID/fd
    

    如下所示:

    vim /etc/passwd
    
    新开终端
    [root@linuxprobe ~]# ps -aux|grep passwd
    root   6705  0.1  0.1 151664  5364 pts/2S+   10:54   0:00 vim /etc/passwd
    root   6707  0.0  0.0 112720   968 pts/0R+   10:54   0:00 grep --color=auto passwd
    
    新开终端
    [root@linuxprobe ~]# ll /proc/6705/fd
    总用量 0
    lrwx------. 1 root root 64 4月  30 10:54 0 -> /dev/pts/2
    lrwx------. 1 root root 64 4月  30 10:54 1 -> /dev/pts/2
    lrwx------. 1 root root 64 4月  30 10:54 2 -> /dev/pts/2
    lrwx------. 1 root root 64 4月  30 10:54 4 -> /etc/.passwd.swp
    
    • 注释:这些 0、1、2就是文件的描述符。一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这3个文件分别对应文件描述符为0、1和2也就是宏替换STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。/proc/进程ID/fs /#这个fd目录下,专门存放文件描述符。对文件描述符的操作就是对文件本身的操作。可以通过修改文件描述符来修改文件。

    2)查看和临时设置一个进程最多可以打开几个文件

    即:一个进程可以打开的文件描述符的限制:

    • 查看文件限制:

      [root@linuxprobe ~]# ulimit -n
      1024

    • 临时修改文件限制:

      [root@linuxprobe ~]# ulimit -n 2048

      [root@linuxprobe ~]# ulimit -n

      2048


    2.重定向的含义

    2.1 输出重定向

    定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器上

    重定向输出使用“>”,">>" 操作符号

    语法:“> 文件名” #表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容。

    “>> 文件名” #表示将标准输出的内容,追加到后面的文件中。若重定向的输出文件不存在,则会新建文件。

    例1:查看当前主机的CPU类型保存到cpu.txt文件中(而不是直接显示到屏幕上):

    cat /proc/cpuinfo > cpu.txt
    

    例2:将当前内核的信息追加到cpu.txt文件中

    uname -a >> cpu.txt
    

    例3:清空一个文件:

     >cpu.txt
    

    2.2 输入重定向

    “ < 文件名”, 输入重定向,将命令的输入由标准输入改为文件名。

    例1:将命令中接受输出的途径由默认的键盘改为其他文件,而不是等待从键盘输入

    grep root < /etc/passwd
    
    [root@linuxprobe ~]# grep root < /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

    例2:mysql中数据导入

    mysql -u root - p 123456 < 123.sql 将123.sql导入mysql数据库中
    

    2.3 EOF

    EOF本意是指End Of File,表明到了文件末尾。“EOF”通常与“<<”结合使用,“<<EOF”表示后续的输入作为子命令或者子shell的输入,直到遇到“EOF”,然后再次返回到主调shell,可以理解为分界符(delimiter)。既然是分解符,那么形式自然不是固定的,这里可以将"EOF"进行自定义,但是前后的“EOF”必须成对出现且不能和shell命令冲突。

    举例:

    1)在a.txt中持续输入字符,使用eof作为分解符

    [root@linuxprobe ~]# cat > b.txt << efo
    > asfdasfl
    > asdfasdg
    > 1231245
    > 4566733
    > 988081
    > efo
    [root@linuxprobe ~]# cat b.txt 
    asfdasfl
    asdfasdg
    1231245
    4566733
    988081
    

    2)在a.txt中持续输入字符,使用自定义如ccc(不与shell命令冲突)作为分解符

    [root@linuxprobe ~]# cat > c.txt <<ccc
    > 1235
    > 7erdrdsf
    > erqtqtzxdg
    > asfqwerqet
    > afddfaf
    > eof
    > eof
    > ccc
    [root@linuxprobe ~]# cat c.txt
    1235
    7erdrdsf
    erqtqtzxdg
    asfqwerqet
    afddfaf
    eof
    eof
    

    3)在脚本中可以通过输入重定向来打印消息菜单

    [root@linuxprobe ~]# vim p.sh
    
     #!/bin/bash
    
    cat << efo
    
    =======================
    
    1.mysql
    2.oracle
    3.httpd
    
    
    =======================
    efo
    
    [root@linuxprobe ~]# chmod +x p.sh
    [root@linuxprobe ~]# ./p.sh
    
    =======================
    
    1.mysql
    2.oracle
    3.httpd
    
    
    =======================
    

    2.4 错误重定向

    将命令执行过程中出现的错误消息(消息或者参数错误)保存到指定的文件,而不是直接显示到显示器

    作用:将错误信息保存到文件
    操作符:标准错误重定向符号: “2>”;标准舒服:1<或者简写<;标准输出:0>或者>;

    在实际应用中,错误重定向可以用来收集执行的错误信息,为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,用于保持脚本输出的简洁

    举例

    1)将错误显示的内容和正确显示的类容分开,将错误信息舒服到error.txt

    [root@linuxprobe ~]# ll /etc/passwd helloworld
    
    ls: 无法访问helloworld: 没有那个文件或目录
    -rw-r--r--. 1 root root 3379 4月  30 10:58 /etc/passwd
    
    [root@linuxprobe ~]# ll /etc/passwd helloworld 2>error.txt
    
    -rw-r--r--. 1 root root 3379 4月  30 10:58 /etc/passwd
    
    [root@linuxprobe ~]# cat error.txt 
    
    ls: 无法访问helloworld: 没有那个文件或目录
    

    2.5 null黑洞和zero空文件

    1). 把/dev/null看作“黑洞”,所有写入它的内容都会永远丢失,而尝试从它哪儿读取内容则什么都读不到。然而/dev/null对命令行和脚本都非常有用
    2). /dev/zero在类unix操作系统中,/dev/zero是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它来产生一个特定大小的空白文件。

    例:使用dd命令产生一个50M的文件

    参数 说明
    if 代表输入文件。如果不指定if,默认就会从stdin中读取输入
    of 代表输出文件。如果不指定of,默认就将会stdout作为默认输出
    bs 代表字节为单位的块大小
    count 代表被复制的块数
    [root@linuxprobe ~]# dd if=/dev/zero of=b.txt bs=1M count=50
    记录了50+0 的读入
    记录了50+0 的写出
    52428800字节(52 MB)已复制,0.058321 秒,899 MB/秒
    

    2.6 &>和>&符号

    &表示等同于的意思

    举例:

    1)把正确和错误的消息输入到相同的位置

    1>&2 把标准输出重新定向到标准错误;
    2>&1 把标准错误重新定向到标准输出;

    等同于把正确和错误的信息放到同一个文件

    [root@linuxprobe ~]# ll /tmp xxx >1.txt 2>&1
    [root@linuxprobe ~]# ll /tmp xxx 2>2.txt 1>&2
    

    2)工作中shell脚本中的>/dev/null 2>&1是什么意思?

    [root@linuxprobe ~]# cat /etc/passwd >/dev/null 2>&1
    

    注:将标准输出和标准错误输出都重新定向到/dev/null,既将产生的所有信息丢弃;


    11.3 管道|的使用

    语法:
    command -a|command -b|command -c|......

    注意:

    • 管道命令只处理前一个命令的正确输出,不处理错误输出;

    • 管道右边的命令,必须能够接受标准输入的数据流命令才行;

    • 管道符可以把两条命令连起来,它可以连接多个命令使用


    11.4 tee命令

    功能:读取标准输入的数据,并将内容输出成文件。

    语法:tee 【-a】【--help】【--version】【文件...】

    参数:-a, --append 内容追加到给定的文件而非覆盖

    tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件;

    举例:

    查询磁盘信息,同时将磁盘信息写入到file.txt

    df -h|tee -a file.txt
    

    ---end

    ---2019-5-3 17:07:19

  • 相关阅读:
    window.print()分页打印
    获取输入框中光标位置
    JavaScript数据结构与算法描述-队列
    .NET中获取IP地址
    记录一次排查C#使用UI Automation获取程序元素的bug
    虚拟机为win server 2012 添加新磁盘
    为halo博客添加ssl证书(配合nginx反向代理)
    初学nginx反向代理
    公告时间轴
    hackthebox-Archetype
  • 原文地址:https://www.cnblogs.com/yj411511/p/10805707.html
Copyright © 2011-2022 走看看