文章目录
一、重定向
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命令。