目录
一.重定向
# touch time
# date > time.txt
//> 将本身输出到屏幕的东西给他弄到time文件中
1.FD
-----标准输入、标准输出、标准错误
file descriptors,FD,文件描述符,文件句柄。进程使用文件描述符管理打开文件。调用一个名字又臭又长的文件很麻烦,这时候就可以将该文件与特定的FD绑定,就比如为1,这时呼唤1就能立刻调出该文件
--类似于链接或者快捷操作
FD是访问文件的标识,即链接文件。省去了冗长的绝对路径
- 0: 是键盘只读
- 1 2: 是终端可以理解是屏幕
- 3+: 是文件,可读可写
程序的FD(链接文件),省去了冗长的绝对路径
我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。
文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I0操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。这意味着如果此时去打开一个新的文件,它的文件描述符会是3,再打开一个文件文件描述符就是4..…
Linux内核对所有打开的文件有一个文件描述符表格,里面存储了每个文件描述符作为索引与一个打开文件相对应的关系,简单理解就是下图这样一个数组,文件描述符(索引)就是文件描述符表这个数组的下标,数组的内容就是指向一个个打开的文件的指针。
通过一个终端,打开一个文本 | # vim 1.txt //注意别关闭,不关闭才能运行占据着一个终端 # tty dev/pts/0 |
通过另一个终端,查询文本程序的进程号 | # ps aux | grep vim 比如1.txt的是5912 |
在/proc目录中查看文本程序的FD | # ls - l /proc/5912/fd # tty /dev/pts/1 # echo 123 > /dev/pts/0 //可以发现会直接输入到1.txt文本中 //dev/pts/0是指终端,此时就代表着正打开着的1.txt //通过调用标准输出文件(1>)实现将1终端的数据输出给0终端的vim程序的1.txt |
扩展 (在后面文件存储章节会讲到) | # ln -s 文件名 链接名 eg: # ln - s 123.txt 333 //123.txt文件已经关闭 # cat 333 //直接通过快捷方式访问
|
vim程序之所以能接收信息反馈信息,靠的就是 /dev/pts/序号 的终端设备文件,为了区别输入和输出就用0、1、2(相当于链接名)来区别,0代表键盘,1和2代表屏幕
# echo 123 > /dev/pts/0(也可以是文件名)之所以能够将东西写进在该终端打开的vim程序,是因为>(相当于1>),调用了标准输出文件,实现了在/dev/pts/1的终端的数据(123)输出给了另一个终端0中的vim程序
而文件也会有0、1、2这些FD,比如# date > date.txt也是一样的道理
通过FD可以将不同的信息引导到别的地方
2.重定向案例> <
2.1 输出>
正确输出 | 1> 等价于 > (>是覆盖) 1>> 等价于 >> (>>是追加) |
案例1:输出重定向:
mkdir是不行的,因为mkdir创建成功本身是没有输出的,需要- v才有输出内容
# mkdir - v 目录 -> test.txt
会将创建成功的信息输出到test文件
案例2:错误输出重定向
错误输出 | 2 > 2 >> |
案例3:正确和错误都输入到相同的位置
&> |
2.2 输入<
< 等价于 0< |
观察默认发送邮件的过程
编写文件 | # mail - s 标题 用户 内容 . //点代表邮件编辑的结束 eg: # mail - s "aaaaa" alice 进行输入内容 . (alice是已经创建出来的用户) |
查看文件 | 先切换到发送目标的用户账号
|
使用重定向快速创建文件
3.扩展
二.管道
1.管道 |
1.1 进程管道Piping
将指令1的输出信息丢给指令2进行加工后再一起输出出来
cut -d切割结束位 -f列号
1.2 tee管道
三通
案例1:
案例2:
2.参数传递Xargs
cp rm一些特殊命令就是不服其它程序
标签:文件,重定向,输出,描述符,管道,FD,linux,txt,pts From: https://blog.csdn.net/caiji0169/article/details/142268032