《Linux从小白到高手》理论篇补充:深入理解Linux中的输入输出及重定向

  1. List item

    今天继续宅家,闲来无事接着写。本篇是《Linux从小白到高手》理论篇补充篇。本篇深入介绍Linux中的输入输出及重定向。
    输入和输出(I/O)是操作系统与用户、程序以及硬件设备之间交互的基本方式。Linux有很多输入输出操作,包括标准I/O、文件I/O、管道、重定向、设备文件等。

一.Linux的输入输出

1. 标准I/O(Standard I/O)

Linux中的标准I/O涉及三个主要流:
标准输入(stdin):文件描述符为0,通常来自键盘。
标准输出(stdout):文件描述符为1,通常输出到终端。
标准错误(stderr):文件描述符为2,通常输出到终端,但可以与标准输出分开处理。

2. 文件I/O

Linux中的文件I/O涉及对文件系统的读写操作。文件可以是普通文件、目录、设备文件(如硬盘、串口等)或管道。

#使用cat命令读取文件内容  
cat file.txt  
#使用echo命令写入文件  
echo "Hello, World!" > file.txt  
#使用重定向操作符追加内容到文件  
echo "Another line" >> file.txt

3. 管道(Pipes)

管道是一个将命令的输出作为另一个命令的输入。使用竖线 | 符号创建管道。

#将ls命令的输出传递给grep命令  
ls | grep "pattern"  
#多级管道  
cat file.txt | grep "pattern" | sort

4. 输入输出重定向

重定向允许你改变标准输入、输出和错误流的默认行为。

#将输入重定向自文件  
wc -l < file.txt  
#将输出重定向到文件  
ls > file_list.txt  
#将错误输出重定向到文件  
grep "pattern" non_existent_file 2> error.log    
#使用`tee`命令同时输出到终端和文件  
ls | tee file_list.txt

5. 设备文件

Linux将硬件设备表示为文件,通常位于 /dev 目录下。例如,硬盘、串口、USB设备等。

#列出所有设备文件  
ls /dev  
#读取串口设备(假设串口设备为/dev/ttyS0)  
cat /dev/ttyS0  
#写入数据到串口设备  
echo "Hello, Serial Port" > /dev/ttyS0

6. 伪终端(Pseudo-Terminals)

伪终端允许程序模拟终端行为,常用于远程登录(如SSH)、终端仿真器等。

#使用`pty`工具创建伪终端  
pty

7. 高级I/O操作

对于更复杂的I/O操作,可以使用编程接口,如C语言中的标准I/O库(stdio.h)或更底层的系统调用(如read(), write(), open(), close()等)。此处不做详细介绍。

二.Linux中的标准输入

Linux的标准输入(stdin) 是指程序接收输入数据的一种默认方式。它通常与键盘相关联,但也可以是从文件或其他程序输出中重定向或管道传输的数据。标准输入是三个标准流之一,另外两个是标准输出(stdout)和标准错误(stderr)。
在Linux命令行中,你可以使用重定向操作符来改变标准输入的行为。例如,你可以使用 < 操作符将文件的内容作为程序的输入:wc -l < file.txt
wc -l 命令会计算 file.txt 文件中的行数,而不是从键盘接收输入。
另外,也可以使用管道(|)将一个命令的输出作为另一个命令的输入,这实际上也涉及到了标准输入的重定向,只不过是由shell自动处理的:ls | grep “pattern”。ls 命令的输出被重定向为 grep 命令的输入,grep 命令会从中筛选出包含 “pattern” 的行。

三.Linux的标准输出和标准错误

在Linux和类Unix操作系统中,标准输出(stdout) 和 标准错误(stderr) 非常重要,它们构成了进程间通信和调试的基础。

标准输出(stdout)

标准输出是进程正常输出数据的地方。在命令行中,当你运行一个程序时,它的正常输出通常会显示在终端上。这个输出就是通过标准输出来实现的。标准输出有一个与之关联的文件描述符(file descriptor),通常是1。
可以将标准输出重定向到一个文件,而不是显示在终端上。例如,使用 > 操作符:
ls > output.txt
这个命令会将 ls 命令的输出重定向到 output.txt 文件中,而不显示在终端上。

标准错误(stderr)

标准错误是进程输出错误信息或警告信息的地方。与标准输出不同,标准错误也有一个与之关联的文件描述符,但通常是2。标准错误的设计初衷是为了将错误信息与正常输出分开,以便更容易地调试程序。
你可以将标准错误重定向到一个文件,或者将其与标准输出合并。例如,使用 2> 操作符可以单独重定向标准错误:

ls non_existent_file 2> error.txt

这个命令会将尝试列出不存在的文件时产生的错误信息重定向到 error.txt 文件中。

如果你想将标准输出和标准错误都重定向到同一个文件,你可以使用 &> 操作符(在某些shell中,如bash,也可以使用 > 操作符并追加 2>&1 来实现):
ls non_existent_file &> all_output.txt

ls non_existent_file > all_output.txt 2>&1
这两个命令都会将 ls 命令的正常输出和错误信息都重定向到 all_output.txt 文件中。

四.详解重定向

重定向是Linux中一个非常强大的功能,它可以改变命令的默认输入和输出行为。

1、重定向的意义

重定向是指将命令的输入或输出从一个默认的位置(如键盘或屏幕)改变到另一个位置(如文件或设备)。在Linux中,重定向主要通过特定的符号(一般是>/>>)和命令来实现。

2、重定向的类型

输入重定向:
输入重定向是指将文件或其他命令的输出作为另一个命令的输入。
使用 < 符号进行输入重定向。例如:command < input_file,这将 input_file 文件中的内容作为 command 命令的输入。
输出重定向:
输出重定向是指将命令的输出发送到文件或设备中,而不是显示在屏幕上。
使用 > 符号进行覆盖输出重定向。例如:command > output_file,这将 command 命令的标准输出重定向到 output_file 文件中,如果文件已存在,则会被覆盖。
使用 >> 符号进行追加输出重定向。例如:command >> output_file,这将 command 命令的标准输出以追加的方式重定向到 output_file 文件中,如果文件不存在,则会被创建。
错误重定向:
错误重定向是指将命令的错误信息(标准错误输出)发送到文件或设备中。
使用 2> 符号进行错误重定向。例如:command 2> error_file,这将 command 命令的错误信息重定向到 error_file 文件中。
合并输出与错误重定向
有时,用户可能希望将命令的标准输出和错误信息同时重定向到同一个文件中。
使用 &> 符号(在某些shell中)或 2>&1 的组合进行合并输出与错误重定向。例如:command &> output_and_error_file 或 command > output_file 2>&1,这将 command 命令的标准输出和错误信息都重定向到 output_and_error_file(或 output_file)中。
3、重定向的用法举例

//将命令输出重定向到文件
ls > file_list.txt
//此命令将当前目录下的文件和文件夹列表输出到 file_list.txt 文件中。
//将命令输出以追加的方式重定向到文件
echo "New line" >> file_list.txt
//此命令将在 file_list.txt 文件的现有内容之后追加一行文本 “New line”。
//将错误信息重定向到文件
grep "nonexistent_pattern" file.txt 2> errors.txt
//此命令尝试在 file.txt 文件中搜索一个不存在的模式,并将产生的错误消息输出到 errors.txt 文件中。
//将标准输出和标准错误同时重定向到同一个文件
ls nonexistent_directory &> output.txt
//或
ls nonexistent_directory > output.txt 2>&1
//这两个命令都尝试列出不存在的目录,并将命令的所有输出(包括错误信息)重定向到 output.txt 文件中。

4、重定向的高级用法
全局重定向:
全局重定向是对后续在Bash中创建的所有子进程都生效的重定向。它通常使用 exec 命令来实现。例如:
exec 5< test1
此命令会打开 test1 文件,并将其文件描述符分配为5。之后,任何使用文件描述符5的命令都会从 test1 文件中读取输入。
输入和输出同时重定向:
有时,用户可能希望将命令的输入和输出都重定向到文件。这可以通过同时使用 < 和 > 符号来实现。例如:
command < input_file > output_file
这将 input_file 文件中的内容作为 command 命令的输入,并将 command 命令的输出重定向到 output_file 文件中。

5、注意事项
–当使用重定向时,务必注意不要不小心覆盖了重要文件。可以先使用 ls 或 cat 命令检查文件内容,以避免不必要的损失。
–在处理大型文件或频繁写入的场景时,应当考虑文件锁定和并发写入的问题,以避免数据损坏。
–重定向符号可以单独使用,也可以与其他命令一起使用。此外,还可以将重定向与管道符号一起使用,实现更复杂的输出操作。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556170.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++模版SFIANE应用踩的一个小坑

一天一个C大佬同事&#xff0c;突然截图过来一段代码&#xff1a;这写的啥呀&#xff0c;啰里吧嗦的&#xff0c;这个构造函数模板参数T1感觉是多余的呀 template<class T> class TestClass { public:TestClass(){}//函数1template<class T1 T, std::enable_if_t<…

vSAN05:vSAN延伸集群简介与创建、资源要求与计算、高级功能配置、维护、故障处理

目录 vSAN延伸集群延伸集群创建延伸集群的建议网络配置vSAN延伸集群的端口见证主机的资源要求vSAN延伸集群中见证节点带宽占用vSAN延伸集群的允许故障数vSAN延伸集群不同配置下的空间占用 vSAN延伸集群的HA配置vSAN延伸集群的DRS配置vSAN存储策略以及虚拟机/主机策略的互操作vS…

十四、深入理解Mysql索引底层数据结构与算法

文章目录 一、索引的本质1、索引是帮助MySQL高效获取数据的排好序的数据结构2、索引的数据结构3、数据结构可视化网站 二、常见数据结构介绍1、B-Tree2、BTree&#xff08;B-Tree变种&#xff09;3、Hash结构 三、存储引擎的索引实现1、MyISAM存储引擎索引实现MyISAM索引文件和…

AI配音(声音克隆)

Fish Audio: Free Generative AI Text To Speech & Voice Cloning 【【AI配音】终于找到免费 & 小白友好的声音克隆软件了&#xff01;真人相似度98%!】https://www.bilibili.com/video/BV1MwbFeCE2X?vd_source3cc3c07b09206097d0d8b0aefdf07958 我终于找到总这3款免…

新机配置Win11

Win11跳联网 在连接网络的界面输入ShiftF10打开命令行&#xff0c;然后输入oobe\bypassnro然后会重启&#xff0c;在联网的界面就可以进行跳过了。 编码 在中国大陆Windows使用的编码是GBK编码 查看电脑系统版本 WinR输入winver即可 桌面图标 设置->个性化->主题…

【机器学习】深度学习、强化学习和深度强化学习?

深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标&#xff0c;虽然都属于机器学习的范畴&#xff0c;但各自的实现方式和侧重点有所不同。 1. 深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于神经网络的…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API&#xff1a; 在开发环境中设置为 /dev-api&#xff0c;这是一个本地 mock 地址&#xff0c;通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA&#xff1a; 设置为 "true"&#xff0c;表示启用调试工具&#xff0c;通常是为了…

【MySQL】-- 库的操作

文章目录 1. 查看数据库1.1 语法 2. 创建数据库2.1 语法2.2 示例2.2.1 创建一个名为java114的数据库2.2.2 创建数据库java114&#xff0c;如果数据库不存在则创建2.2.3 查看警告信息 3. 字符集编码和校验&#xff08;排序&#xff09;规则3.1 查看数据库支持的字符集编码3.2 查…

动态SLAM总结二

文章目录 Mapping the Static Parts of Dynamic Scenes from 3D LiDAR Point Clouds Exploiting Ground Segmentation&#xff1a;&#xff08;2021&#xff09;RF-LIO&#xff1a;&#xff08;2022&#xff09;RH-Map&#xff1a;&#xff08;2023&#xff09;Mapless Online …

子比主题美化 – 添加天气教程

前言 经常看到很多的网站顶部或者侧边有显示天气状态的小条幅&#xff0c;看着也美观&#xff0c;寻思着也在自己的小站上显示天气。大体的思路是能识别用的ip地址来确认位置然后以代码形式在前台显示出。 经过在百度上搜索一番&#xff0c;发现一个很不错的天气api&#xff…

万界星空科技MES数据集成平台

制造执行系统MES作为连接企业上层ERP系统和现场控制系统的桥梁&#xff0c;承担了实时数据采集、处理、分析和传递的重要任务。MES数据集成平台是一个集成各类数据源&#xff0c;将数据进行整合和统一管理的系统&#xff0c;通过提供标准化接口和协议&#xff0c;实现数据的无缝…

GOME数据IDL处理

GOME数据后缀为xdr 数据url&#xff1a;https://lweb.cfa.harvard.edu/~xliu/GMLV3/ 官方文档给出的读取方式为IDL&#xff08;restore方式&#xff09;&#xff1a; 以下是包含的数据字段&#xff1a; ;print,LONS ;print,ALB ;print,NLON ;print,NLAT ;print,LATS ; AVGK…

基于ssm 框架的java 开发语言的 在线教育学习平台系统设计与实现 源码 论文

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)

前言 随着kotlin代码跨平台方案的推出&#xff0c;kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪&#xff0c;作为一个敏捷型开发的公司&#xff0c;依然少不了Android和iOS的同步开发&#xff0c;实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平…

系统设计,如何设计一个秒杀功能

需要解决的问题 瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法 前端设计 利用 CDN 缓存静态资源&#xff0c;减轻服务器的压力在前端随机限流按钮防抖&#xff0c;防止用户重复点击 后端设计 Nginx 做统一接入&#xff0c;进行负载均衡与限流用 sentinel 等…

工具 | 红队大佬亲测5款推荐的Burpsuite插件

*免责声明&#xff1a;* *本文章仅用于信息安全技术分享&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作…

【LeetCode-热题100-128题】官方题解好像有误

最长连续序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-consecutive-sequence/?envTypestudy-plan-v2&envIdtop-100-liked 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的…

LLM大模型学习精要系列(一):掌握基础,开启大模型之旅

1.前言 1.1 基础模型研究 2023 年&#xff0c;随着 LLM 技术的发展&#xff0c;中国模型研究机构的开源模型迎来了爆发式的增长&#xff1a; 2023 年 3 月&#xff0c;智谱 AI 首先在魔搭社区发布了 ChatGLM-6B 系列&#xff0c;ChatGLM-6B 是一个开源的、支持中英双语问答的…

如何只修改obsidian图片链接为markdown

如何只修改obsidian图片链接为markdown 前言插件配置 使用注意 前言 适合有一定了解obsidian用法和插件市场&#xff0c;还有相对路径的人 插件 在obsidian插件市场搜索—开梯子 配置 首先使用ctrlp打开命令面板&#xff0c;也可以在左侧通过图标打开命令面板&#xff0c…