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. Java数据库小项目02--管家婆项目

    目录 项目要求 开发环境搭建 工具类JDBCUtils 创建管家婆数据表 项目分层 MainApp层 MainView层 ZhangWuController层 ZhangWuService层 Zhan ...

  2. Educational Codeforces Round 33 (Rated for Div. 2) C题·(并查集变式)

    C. Rumor Vova promised himself that he would never play computer games... But recently Firestorm — a ...

  3. @JsonIgnore等

    作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. 使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性. 场景模拟: 需要把一个List< ...

  4. Comet OJ - Contest #11 B 背包dp

    Code: #include <bits/stdc++.h> #define N 1005 #define M 2000 #define setIO(s) freopen(s". ...

  5. linux command pushd popd

    Linux command pushd popd [Purpose]        Learning linux command  pushd popd   [Eevironment]        ...

  6. 数据结构实验之链表四:有序链表的归并(SDUT 2119)

    #include <bits/stdc++.h> using namespace std; struct node { int data; struct node *next; }; st ...

  7. 如何选CDN:互联网大直播时代的CDN选择指南

    转: 如何选CDN:互联网大直播时代的CDN选择指南 from:  http://www.chnvideo.com/blog-classic-cdn.html SRS 编码器   如何选CDN:互联网 ...

  8. ci 框架中defined('BASEPATH') OR exit('No direct script access allowed');

    作用: OR 就是前面的是true时,就不走后面了. 加这个是为了防止不是从index.php访问到的控制器

  9. linux文件结构---转发

    linux各文件夹的作用---转载   linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配 ...

  10. vue-cli2.x版本安装vue-cli建项目

    全局安装vue-cli 命令行输入: vue-cli版本在3以下 npm install --global vue-cli 安装vue-cli后,可以查看一下是否安装成功vue --version, ...