当前位置: 首页 > article >正文

《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.kler.cn/news/337103.html

相关文章:

  • PTA:6-3 圆柱体计算JAVA
  • 国外电商系统开发-运维系统文件上传-快速上传
  • vue2和vue3中的组件间通信知识点总结
  • Redis: Sentinel工作原理和故障迁移流程
  • 【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart
  • python全栈学习记录(二十三)反射、内置方法、类相关的函数、元类
  • 性能测试学习6:jmeter安装与基本配置/元件/线程组介绍
  • 智能涌现|迎接智能时代,算力产业重构未来
  • java 读取导出 resources目录下的文件,导出给前端
  • IDEA 最新版创建 Sping Boot 项目没有 JDK8 选项的解决方案
  • 运维工具箱
  • 高级java每日一道面试题-2024年10月2日-分布式篇-什么是FLP 不可能性定理?
  • 鸿蒙next开发第一课03.ArkTs语法介绍-案例
  • 操作系统 | 学习笔记 | 王道 | 4.2 目录
  • 使用 Spring Boot 在电商平台中动态调整促销信息
  • Java学习——JDK
  • vue3 antd-design-vue3 日期组件语言不显示中文问题
  • 【数据结构与算法】B树
  • 论文翻译 | ReWOO: 高效增强语言模型的解耦推理
  • Linux搭建Hadoop集群(详细步骤)