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

学习笔记:CentOS 7学习之十一:文件的重定向的更多相关文章

  1. 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用

    目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...

  2. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  3. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理

    目录 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理 17.1 计划任务-at-cron-计划任务使用方法 17.1.1 at计划任务的使用 17.1.2 查看和删除at将要执行 ...

  5. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

  6. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

  7. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  8. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

  9. 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用

    目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...

  10. 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用

    目录 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用 23.1 跳出循环 23.1.1 break和continue 23.2 Shift参数左移指令 23.3 函数 ...

随机推荐

  1. error MSB6006: “cmd.exe”已退出,代码为 3。

    error MSB6006: “cmd.exe”已退出,代码为 3. 这两天调程序遇到一个奇怪的问题. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4. ...

  2. CSS测试题Ⅱ

    1.如何使用 CSS3 强制换行? A. word-wrap: break-word; B. text-wrap: break-word; C. text-wrap: force; D. text-w ...

  3. [Luogu] 时间复杂度

    https://www.luogu.org/problemnew/show/P3952 考场上输出的是 "YES" "NO" ++ ,如果不是亲身经历,打死我我 ...

  4. C#字符串和值转换 以及万能转换

    2.使用万能转换器进行不同类型转换 Convert.ToXxx(object value) int  iRet = Convert.ToInt32("201"); float fR ...

  5. 秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒)

    皮秒 皮秒,符号ps(英语:picosecond ).1皮秒等于一万亿分之一秒(10-12秒) 1,000 皮秒 = 1纳秒 1,000,000 皮秒 = 1微秒 1,000,000,000 皮秒 = ...

  6. Codeforces 940 E.Cashback (单调队列,dp)

    Codeforces 940 E.Cashback 题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序 ...

  7. Pap.er 模仿 - 第二天

    最后更新:2017-12-19 在第一天中, 我们完成了项目的基本设置.隐藏Dock.显示和隐藏Popover等操作,接下来的这章中, Pap.er将会去搭建对应 UI. 一.设置Popover对应颜 ...

  8. maven mvn 命令行 编译打包

    * 配置好jdk * 下载安装maven http://maven.apache.org/download.cgi apache-maven-3.3.3-bin.zip * 解压到G:\apache- ...

  9. crobtab

    在使用node-cron包,作者在issue建议使用 https://crontab.guru/ 测试使用定时任务 发现一个问题 https://crontab.guru/#0_23_11-12,18 ...

  10. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别

    1:全局变量的说明之前再加上static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别在于,非静态全局变量的作用域是整 ...