【Linux】输入输出管理

一 输入输出使用到的系统资源

1.1 字符设备(Character Devices)

什么是字符设备

字符设备是 Linux 中的一类设备,支持以字符为单位进行数据传输。与块设备不同,字符设备不需要缓 冲区,即数据是逐字节直接传递的。典型的字符设备包括串口、键盘、鼠标、伪终端等

字符设备的用途与典型应用场景

字符设备的主要用途是与硬件直接交互,比如读取传感器数据或控制某些外设。典型场景包括:

  • 提供用户空间与硬件交互的接口。
  • 模拟设备,用于调试或测试。
  • 创建自定义的和应用层通信的方法。

常见的字符设备文件

终端设备:

bash 复制代码
/dev/tty 							#当前终端。
/dev/tty0、/dev/tty1、/dev/tty2 	   #系统的虚拟控制台

伪终端:

bash 复制代码
/dev/pts/* 							#伪终端设备,用于终端仿真。

1.2 程序的输入输出

程序的输入输出包含的信息有:

bash 复制代码
stdio:  #标准输入,编号为0
stdout: #标准正确输出,编号为1
stderr: #标准错误输出

!NOTE

程序在开启后会在/proc/pid/fd/这个目录中利用系统中的输入输出设备文件在此目录中建立用于处理输入输出字符的设备文件

二 管理系统中的输入输出

2.1 什么是重定向?

将原本要输出到屏幕上的内容,重新输入到其他设备中或文件中

重定向类型包括

  • 输入重定向
  • 输出重定向

2.2 输入重定向

指定设备(通常是文件或命令的执行结果)来代替键盘作为新的输入设备

BASH 复制代码
#单行输入重定向示例
vim test
test
TEST
testfile
TESTFILE

tr 'a-z' 'A-Z' < lee ##把test文件中的内容定向到tr程序中
bash 复制代码
#多行输入重定向示例
tr 'a-z' 'A-Z' <<EOF (字符任意)
test 			#此处的test不能表示为文件名称只表示test字符
test1
EOF 			(当首字母再次出现表示录入结束)

2.3 输出重定向

将原本要输出在屏幕上的结果放到指定的设备(通常是文件)

重定向作用

  • 当屏幕输出的信息很重要,而且希望保存重要的信息备份
  • 不干扰屏幕的使用,例如ping baidu
  • 储存错误/报错日志
  • 定时任务的运行结果
  • 执行一个命令,把报错信息丢弃到/dev/null
  • 执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文 件。

输出重定向类型

类型符号 作用
> 重定向正确输出
2> 重定向错误输出
&> 重定向所有输出

以下的示例要在普通用户上完成,权限不多会报错误

正确输出重定向

复制代码
#重定向正确输出
find /etc -name passwd > test.out	#剩下的错误输出就会输出再屏幕终端上

错误输出重定向

bash 复制代码
#重定向错误输出
find /etc -name passwd 2> test.err	#剩下的正确输出就会输出再屏幕终端上

重定向所有输出

bash 复制代码
#重定向所有输出
find /etc -name passwd &> test.all

!CAUTION

输出重定向会覆盖源文件内容

2.4 追加定向类型

追加定向类型符号 作用
>> 追加正确食输出到文件
2>> 追加错误输出到文件
&>> 追加所有输出到文件
bash 复制代码
find /etc -name passwd >> test.out
find /etc -name passwd 2>> test.err
find /etc -name passwd &>> test.all

!NOTE

追加定向不会覆盖原文件内容

2.5 管道

管道在Linux中是一种特殊的文件类型,它在内存中创建一个缓冲区,用于存储一个命令的输出和另一个 命令的输入。当使用管道连接命令时,前一个命令的标准输出(stdout)会被重定向到管道的写端,而 后一个命令的标准输入(stdin)会被连接到管道的读端

bash 复制代码
#统计/bin 目录中有多少文件
ls /bin/ | wc -l

2>&1

当使用管道时,只有正确输出会被管道处理,错误输出是无法通过管道的,如果想让管道处理错误输 出,需要把错误输出放到正确输出的设备中,2>&1就是用来完成此操作的

bash 复制代码
#统计find命令输出结果的行数
find /etc/ -name passwd 2>&1 | wc -l

tee

当输出通管道后,内容就被管道处理了,如果行看到输出内容需要对输出内容进行复制然后在通过管道 处理

bash 复制代码
find /etc -name passwd 2>&1 | tee test.all | wc -l
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式