Linux 标准输入输出、重定向及管道

随笔一篇,以便日后翻阅,如有问题欢迎指正
操作环境:Ubuntu 21.10 desktop
shell版本:Xshell

因为所学知识有限,所以本文结合了多篇文章的精华并适当添加了自己的内容
其实就是个只会Ctrl cv 的屑(bushi)
文章出处将在文末标出



前言

频道的概念(流):
Linux系统有专属于自己的输入输出频道,类似于看电视,可以通过遥控板随意切换频道,而显示屏就会根据频道不同显示不同内容。
默认将键盘叫做标准输入设备:stdin,频道为0
将屏幕叫做标准输出设备:stout,频道为1
还有一个频道,是专门为输出的错误信息准备的:stderr,频道为2

描述符缩写描述
0STDIN标准输入
1STOUT标准输出
2STDERR标准错误输出

深入理解:linux随笔(一) | 标准输入、输出、错误流
下面由几个例子来解释文件的标准输入、标准输出、输出重定向


标准输出

利用命令行实现输出:

pepino@Pepino:~$ echo "this is a test"
this is a test

这就是标准输出,默认输出到屏幕上供人查看
或者用ls命令深入理解默认输出概念:

pepino@Pepino:~$ ls
公共的  模板  视频  图片  文档  下载  音乐  桌面

同样是输出到屏幕上


标准输入

默认输入设备是键盘,但也可以通过文件输入,但需要结合重定向一起理解
通过 tr 命令体验标准输入输出的交互

pepino@Pepino:~$ tr "a-z" "A-Z"		#将输入的 a-z 小写字符自动转换为大写输出
asdfghj
ASDFGHJ

ctrl + d 退出


标准错误输出

默认输出设备是屏幕,输出错误提示以便提示程序员和纠错


重定向

标注输入、标准输出与标准错误输出都可以通过特定符号改变来源或去向

常见重定向有:

  • 输入重定向
  • 输出重定向
  • 追加重定向
  • 错误输出重定向
  • 双重输出重定向

输入重定向

有一些指令需要用户从标准输入(键盘)来输入数据,但数据量巨大的时候让用户手动输入的话,将会相当麻烦

输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;

使用小于符号 < 来重定向输入源

使用vi命令编辑一个新文件 test1.txt 并输入内容12345

pepino@Pepino:~$ vi test1.txt
pepino@Pepino:~$ cat < test1.txt	#将 test1.txt 文件作为输入源
12345

补充:Linux之vi编辑器


输出重定向

大多数的指令在正确执行后都会有一个执行结果显示在标准输出(屏幕终端)上。一般是另存到一个文件中供以后分析,而不再显示屏幕终端上。

输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

使用大于符号 > 来重定向输出环境

pepino@Pepino:~$ ls > test2.txt		#将 ls 的输出内容直接传到文件 test2.txt 内而不显示在屏幕上
pepino@Pepino:~$ cat test2.txt
公共的
模板
视频
图片
文档
下载
音乐
桌面
test1.txt
test2.txt

注意:如果原文件存在并有内容,那么新的执行结果会覆盖原文件内容。


追加重定向

刚刚提到,使用 > 进行输出重定向,文件的原内容会被覆盖。那么有没有一个办法不覆盖原文件内容,只是追加在其后呢?

使用 >> 就可以将正确的输出结果追加到一个文件中

pepino@Pepino:~$ ls -a >> test2.txt
pepino@Pepino:~$ cat test2.txt 
公共的
模板
视频
图片
文档
下载
音乐
桌面
test1.txt
test2.txt
公共的
模板
视频
图片
文档
下载
音乐
桌面
test1.txt
test2.txt

错误输出重定向

如果一个指令执行错误时,也会在屏幕上显示错误提示信息。虽然它与标准输出一样都会将结果显示在屏幕上,但它们占用的 I/O通道 不同。

如果要将错误结果重定向到另一个地方则就不能再使用 > 来实现了
因为标准错误输出的频道是2
所以使用 2> 将报错讯息重定向。

pepino@Pepino:~$ de -h 2> test3.txt		#试错命令 de -h 将报错信息存入文件 test3.txt 中
pepino@Pepino:~$ cat test3.txt 
de:未找到命令

也可使用 2>> 将报错讯息追加入一个文件

pepino@Pepino:~$ lt -l 2>> test3.txt	#试错命令 lt -l 将报错信息追加到文件 test3.txt 
pepino@Pepino:~$ cat test3.txt 
de:未找到命令
Command 'lt' not found, but can be installed with:
sudo apt install looptools

双重输出重定向

如果用户想将正确的输出结果错误输出结果一次性单独地送到不同的地方则可使用双重输出重定向

pepino@Pepino:~$ ls -l 2> error > results
pepino@Pepino:~$ cat error		#无显示表示没有标准错误输出
pepino@Pepino:~$ cat results 
总用量 52
drwxrwxr-x 2 pepino pepino 4096 Apr 13 18:36 1
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 公共的
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 模板
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 视频
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 图片
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 文档
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 下载
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 音乐
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 桌面
-rw-rw-r-- 1 pepino pepino    0 Apr 13 20:40 error
-rw-rw-r-- 1 pepino pepino    0 Apr 13 20:40 results
-rw-rw-r-- 1 pepino pepino    6 Apr 13 20:09 test1.txt
-rw-rw-r-- 1 pepino pepino  304 Apr 13 20:29 test2.txt
-rw-rw-r-- 1 pepino pepino   99 Apr 13 20:35 test3.txt
-rw-rw-r-- 1 pepino pepino   10 Apr 13 18:48 test.txt

如果用户将不管是正确输出还是错误输结果都送到同一个指定的地方
可使用 &>&>> 来完成。

pepino@Pepino:~$ ls -l &> test4.txt
pepino@Pepino:~$ lt -l &>> test4.txt 	#错误命令 lt -l 输出追加到文件 test4.txt
pepino@Pepino:~$ cat test4.txt 
总用量 60
drwxrwxr-x 2 pepino pepino 4096 Apr 13 18:36 1
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 公共的
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 模板
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 视频
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 图片
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 文档
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 下载
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 音乐
drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 桌面
-rw-rw-r-- 1 pepino pepino  802 Apr 13 20:43 error
-rw-rw-r-- 1 pepino pepino  875 Apr 13 20:47 result
-rw-rw-r-- 1 pepino pepino    0 Apr 13 20:43 results
-rw-rw-r-- 1 pepino pepino    6 Apr 13 20:09 test1.txt
-rw-rw-r-- 1 pepino pepino  304 Apr 13 20:29 test2.txt
-rw-rw-r-- 1 pepino pepino   99 Apr 13 20:35 test3.txt
-rw-rw-r-- 1 pepino pepino    0 Apr 13 20:48 test4.txt
-rw-rw-r-- 1 pepino pepino   10 Apr 13 18:48 test.txt
Command 'lt' not found, but can be installed with:
sudo apt install looptools

双重输入重定向(结束符)

用户可以通过 cat > file 来创建文件并为文件输入内容,输入结束后按下快捷键 ctrl+d 结束输入。

pepino@Pepino:~$ cat > test5.txt
123
(Ctrl+d)
pepino@Pepino:~$

默认是ctrl+d 结束输入,但如果用户想要多行输入怎么办?
一旦敲回车就自动输出了,可以用 << 选择任意符号作为终结标识符

pepino@Pepino:~$ cat > test5.txt << stop
> 123		
> 234
> 456
> 567		
> stop		#实现多行输入,直到识别到结束符
pepino@Pepino:~$ 

重定向的使用规律(总结)

  • 标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变其中的一个
  • 标准输入0和标准输出1可以省略(当其出现重定向符号左侧时)
  • 文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&
  • 文件描述符与重定向符号之间不能有空格

本文只介绍基本概念,具体使用情况还得看实际操作环境和要求
补充:linux 文件描述符详解,详解Linux文件描述符


管道

管道名称非常形象。所谓管道,是Linux系统中将一个进程的输出连接到另一个进程的输入,从而允许进程间通信的文件。因此,可以简单地讲,管道的作用是充当两个进程间数据交换的通道。可以把Linux系统中需要通信的两个文进程比作是两段断开的水管,现在需要将一段水管中的水引入到另外一段水管中。为了达到这个目的,需要一段中间的转接水管。而管道则承担这个角色。参与数据交换的两个进程就是那两段断开的水管,管道就是中间的转接水管,而数据就是水管中的水。

  • 管道是Linux中很重要的一种通信方式,它是把一个程序的输出直接连接到另一个程序的输入。

  • 常说的管道一般是指无名管道(例如 | ),无名管道只能用于具有”亲缘”关系进程之间的通信,通常和 grep 合作使用。

  • 使用“ | ”将前一个进程的输出直接送入后一个进程的输入(拼接)

      例1:
      pepino@Pepino:~$ ls | wc -l
      17
      
      注:wc -l		#输出行数统计
      
      例2:
      pepino@Pepino:~$ ls -l | head -3
      总用量 64
      drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 公共的
      drwxr-xr-x 2 pepino pepino 4096 Apr  6 00:10 模板
    
      注:head -3		#查看当前目录下前3行文本
    
      例3:
      pepino@Pepino:~$ cat test3.txt | grep a	#grep 过滤作用
      Command 'lt' not found, but can be installed with:
      sudo apt install looptools
      pepino@Pepino:~$ 
    

类似的应用还有很多,请根据实际情况自行灵活运用


综合应用:

cat  file1 > file2					#拷贝file1到file2
cat file1 file2 file3 > fileall		#将数个小文件合并成一个文件
ls –l | more						#分屏显示当前目录下的文件

小练习


参考文章明细

  1. 一文搞懂Linux下的文件的标准输入、标准输出、输出重定向问题
  2. Linux中的标准输入输出
  3. Linux的标准输入输出
  4. Linux重定向(输入输出重定向)
  5. linux管道举例理解
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PiB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值