【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
相关推荐
遇见火星3 小时前
Aiops探索:基于Ansible的Dify版本运维智能体落地思路
运维·服务器·ansible
晨曦夜月4 小时前
vim及其模式的操作
linux·编辑器·vim
zl_dfq4 小时前
Linux基础开发工具 之 【yum、vim、gcc/g++】
linux·1024程序员节
TG_yunshuguoji5 小时前
亚马逊云渠道商:如何通过配置自动替换构建故障自愈的云架构?
运维·服务器·架构·云计算·aws
守望时空335 小时前
使用virt-manager图形化创建和管理KVM虚拟机
linux·kvm
期待着20135 小时前
StarRocks 集群安装部署文档
linux·服务器
凤凰战士芭比Q5 小时前
部署PHP8.4(KylinV10SP3、Ubuntu2204、Rocky9.3)
linux
2301_772093566 小时前
高并发webserver_interview
运维·服务器·数据库·后端·网络协议·mysql·wireshark
haimin03716 小时前
ubuntu 20.04 安装xrdp远程桌面访问
linux·运维·ubuntu