【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
相关推荐
林_学几秒前
Docker Desktop 全卸了,新项目上线从3天缩短到3分钟
运维·docker·容器
陈平安Java and C1 分钟前
Docker镜像原理
运维·docker·容器
爱吃山竹的大肚肚1 分钟前
Nginx 最核心和常用的命令
java·运维·服务器·前端·nginx
程序员在线炒粉8元1份顺丰包邮送可乐3 分钟前
Docker 部署PaddleOCR 实战教程(含离线模型、接口调用、排障)
运维·docker·ai·容器
天上飞的粉红小猪4 分钟前
Socket UDP编程
linux·网络协议·udp
aosky18 分钟前
Vercel Labs agent-browser 深度测评:AI时代的浏览器自动化利器
运维·人工智能·自动化·agent-browser
柠檬汁Dev23 分钟前
云端开发,把应用上线时间从2天缩短到3分钟
服务器
皓月盈江23 分钟前
Linux Debian13安装后更换为国内镜像源,解决执行sudo命令提示用户名不在sudoers文件中问题
linux·服务器·sudo·debian13·debian13更换国内镜像源·用户名不在sudoers文件中
wdfk_prog24 分钟前
[Linux]学习笔记系列 -- [driver][base]class
linux·笔记·学习
龙仔72527 分钟前
ZLMediaKit 日志按日期切割与自动清理方案
运维·服务器·日志切割·自动删除