Linux管道和重定向

一、重定向

1、概述

重定向命令列表

命令说明
command > file将输出重定向到file
command < file将输入重定向到file
command >> file将输出以追加方式重定向到file
n > file将文件描述符为n的文件重定向到file
n >> file将文件描述符为n的文件已追加方式重定向到file
n >& m将输出文件m和n合并
n <& m将输入文件m和n合并
<< tag将开始标记tag和结束标记tag之间的内容作为输入

2、文件描述符

FD(file descriptors,文件描述符):进程使用文件描述符来管理打开的文件。

0:通常是标准输入(STDIN)
1:是标准输出(STDOUT)
2:是标准错误输出(STDERR)

在这里插入图片描述
查看文件FD调用情况命令:

# ls /proc/进程ID/fd
# ll /proc/进程ID/fd

3、重定向案例

>:覆盖
>>:追加,不覆盖

(1)输出重定向

标准正确输出:1> 等价于 >、1>> 等价于 >>
标准错误输出:2>、2>>

案例一:正确输出重定向1>、1>>
在这里插入图片描述
示例:

# date
2023年 07月 05日 星期三 20:15:05 CST

# date 1> date.txt 等价于 date > date.txt
# cat date.txt
2023年 07月 05日 星期三 20:15:25 CST

# date 1>> date.txt 等价于 date >> date.txt
# cat date.txt
2023年 07月 05日 星期三 20:15:25 CST
2023年 07月 05日 星期三 20:17:12 CST

案例二:错误输出重定向2>、2>>
在这里插入图片描述
错误示范:

# ls /home/ 2> list.txt
tom
# cat list.txt
结果发现list.txt文件中没有内容,因为没有错误信息

正确示范:

# ls /aaaaaaaaaaaa 2> list.txt
# cat list.txt 
ls: 无法访问/aaaaaaaaaaaa: 没有那个文件或目录

案例三:正确和错误都输入到相同位置&>、&>>
在这里插入图片描述
示例:

# ls /home/ /aaaaaaaaaaa &> list.txt
# cat list.txt 
ls: 无法访问/aaaaaaaaaaa: 没有那个文件或目录
/home/:
tom

以上内容等同于以下内容:

# ls /home/ /aaaaaaaaaaa 1> yes.txt 2> no.txt
# cat yes.txt
/home/:
tom
# cat no.txt
ls: 无法访问/aaaaaaaaaaa: 没有那个文件或目录

(2)输入重定向

标准输入:0< 等价于 <

案例:输入重定向发送邮件
先准备一段邮件内容:

[root@localhost ~]# vim word.txt
555
666
777

发送邮件:

[root@localhost ~]# mail -s 'test01' tom < word.txt 

原理:利用输入重定向,把文件内容代替人为的输入。

查看邮件:

[root@localhost ~]# su - tom
上一次登录:四 7月  6 17:44:45 CST 2023pts/0 上
[tom@localhost ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/tom": 3 messages 1 new
    1 root                  Thu Jul  6 17:40  21/614   "sss"

>N  2 root                  Thu Jul  6 17:50  20/606   "test01"
& 2    //按邮件编号回车,即可查看邮件
Message  2:
From root@localhost.localdomain  Thu Jul  6 17:50:24 2023
Return-Path: <root@localhost.localdomain>
X-Original-To: tom
Delivered-To: tom@localhost.localdomain
Date: Thu, 06 Jul 2023 17:50:24 +0800
To: tom@localhost.localdomain
Subject: test01
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R

555
666
777

& q    //按q退出
Held 3 messages in /var/spool/mail/lk

二、管道

1、概念

管道是Linux中的最古老的通信方式;
我们把一个进程链接到另一个进程的一个数据流称为一个"管道"。
管道也是文件。在使用管道符 “|” 时, “|” 左边的进程以写的方式打开管道文件,将标准输出重定向到管道之中, “|” 右边的进程以读的方式打开管道文件,将标准输入重定向到管道之中。
在这里插入图片描述

2、管道的特点

管道的特点:
1、管道是单向通信的.
2、管道本质是文件。因为文件描述符的生命周期是随进程的,所以管道的生命周期也是随进程的。
3、管道通信,通常用来进行具有“血缘”关系的进程之间的通信。如父子进程间通信。
4、pipe系统调用打开的管道,并不清楚它的名字,称之为匿名管道。
5、在管道通信中,写入的次数与读取的次数,不是严格匹配的。
6、管道具有一定的协同能力,让读端与写端按照一定的步骤进行通信:

  • 1)如果读端读取完毕了所有的管道数据,此时如果写端不写,读端就只能等待。
  • 2)如果写端将管道写满了,就无法再继续写入,等读端读取之后才能继续写。
  • 3)如果关闭了写端,读端读取完毕管道数据后,再读,read就会返回 0 ,表明读到了文件结尾。
  • 4)如果写端一直在写,并关闭了读端,那么OS会通过信号终止一直在写入的进程。因为OS不会维护无意义、低效率、浪费资源的事情。

7、当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

3、管道的分类

(1)进程管道piping

简介:管道命令可以将多条命令组合起来,一次性完成复杂的处理任务。
在这里插入图片描述

指令1的标准输出,作为指令2的标准输入。

语法:

# 指令1 | 指令2 | 指令3 | ……

万用管道:

# 指令1 | grep '字符串'

多命令同时执行:

# 命令1 && 命令2
命令1执行成功会执行命令2,命令1执行失败不会执行命令。

# 命令1 || 命令2
命令1执行失败就执行命令2,命令1执行成功就不执行命令2,命令2是备胎。

# [] || 命令;
检测,不存在执行命令

示例:

# cat /etc/passwd | tail -3
# ps aux | head -5
# ip a | grep ens33 | awk 'NR==2' | awk '{print $2}'        /NR==2:第2行  $2:第2列
192.168.200.128/24

检测/root/abc.txt是否存在,不存在则创建/root/abc.txt:
# [ -f /root/abc.txt ] || touch /root/abc.txt

检测用户kkk是否存在,不存在则创建用户并设置口令:
# id kkk 2>/dev/null || ( useradd kkk && echo '000000' | passwd --stdin kkk )

(2)tee管道

简介:三通管道,即交给另一个程序处理。又保存一份副本。
直白点就是:多命令的情况下,想保存哪条命令的内容就在其管道 | 后加上tee。
在这里插入图片描述
语法:

# 指令1 |tee 文件 | 指令2 |tee 文件 | ……

案例:

# cat /etc/passwd |tee file.txt | head -1
root:x:0:0:root:/root:/bin/bash

# cat file.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
结果发现:file.txt存储的是指令cat /etc/passwd的内容。

(3)参数传递Xarge

步入 cp rm 一些特殊命令就是不服其他程序,不接受标准输出。
语法:

# 指令1 |xarge 指令(rm -rf或cp等) 

案例:

准备一些文件:
# touch /home/file{1..5}
# ls /home
file1  file2  file3  file4  file5
# vim files.txt
/home/file1
/home/file2
/home/file3
/home/file4

使用管道:
# cat files.txt | rm -rf
# ls /home/
file1  file2  file3  file4  file5
发现此次操作失败的,/home下的文件未被删除。

使用Xarge:
# cat files.txt |xargs rm -rf
# ls /home/
file5
发现/home下的文件被删除,说明通过|xargs成功链接rm命令。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值