重定向
引入
date
命令可以查看当前系统的时间
2024年 01月 15日 星期一 11:18:45 CST
我们我也可以将命令的输出结果指定到一个文件中,不直接输出在屏幕上:date > 目标文件
eg:
[root@localhost ~]# date > time.txt
[root@localhost ~]# cat time.txt
2024年 01月 15日 星期一 11:18:45 CST
使用这个 >
命令就是重定向的过程
FD
FD简介
file descriptors ,FD
,又叫文件描述符,文件句柄。进程使用FD
来管理打开的文件(进程)。
每个进程有一个FD,FD类似一个快捷键,我们调用一个进程的时候可能需要输入比较长的命令,而直接使用进程对应的FD就可以直接调用。FD是访问文件的标识,链接文件,省去冗余的绝对路径。
FD一般是用一个数字进行表示的,数字范围是0-255。
其中0,1,2
是比较特殊的数字,控制特殊的程序:
- 0:标准输入,系统的输入文件描述符, 将用户输入键盘的内容输入到程序中。
- 1:标准输出,系统的输出文件描述符,将程序输出内容显示到显示器上,只输出
正确
的内容 - 2:标准错误输出,系统的输出文件描述符,和1的区别是2只输出
错误
的信息
- 3~255:是系统其他文件到的文件描述符
进程 FD的查看
ls /proc/进程号/fd
eg:
[root@localhost ~]# ls /proc/5912/fd
0 1 2 4
其中 0 ,1,2 表示的是系统的输入输出FD, 4表示的是该文件的FD。
一般情况下任何一个程序都有0,1,2
三个FD,因为一个程序必须有输入和输出操作。
查看FD具体的信息:ls -l /proc/5912/fd
root@localhost ~]# ls -l /proc/5912/fd
l rwx------. 1 root root 64 2月 19 11:45 0 ->/dev/pts/0
l rwx------. 1 root root 64 2月 19 11:45 1 ->/dev/pts/0
l rwx------. 1 root root 64 2月 19 11:43 2 ->/dev/pts/0
l rwx------. 1 root root 64 2月 19 11:43 4 ->/root/.66566.txt.swp
1 ->/dev/pts/0
: 表示输出到pts0窗口。
dev文件夹是硬件设备:pts表示 终端窗口,null表示垃圾桶
重定向指令
输出重定向
输出重定向就是将需要输出的内容输出到指定位置,可以是另一个终端,也可以是一个文件,等。
正确输出
命令 > 目标文件
: 就表示将命令的正确的输出结果输出到目标文件中,并且会覆盖之前输出的内容,> 等价于 1>
,其实就是FD中的1命令 >> 目标文件
: 就表示将命令的正确的输出结果输出到目标文件中,是追加操作,不i会覆盖之前的内容,>> 等价于1>>
, 其实就是FD中的1
eg;
[root@localhost ~]# date 1> time.txt
[root@localhost ~]# cat time.txt
2024年 01月 15日 星期一 11:18:45 CST
[root@localhost ~]# date 1>> time.txt
[root@localhost ~]# cat time.txt
2024年 01月 15日 星期一 11:18:45 CST
2024年 01月 15日 星期一 11:19:45 CST
错误输出
命令 2> 目标文件
:就表示将命令的错误的输出结果
输出到目标文件中,并且会覆盖之前输出的内容,其实就是FD中的2命令 2>> 目标文件
:就表示将命令的错误的输出结果
追加到目标文件中,是追加操作,不会覆盖之前的内容,其实就是FD中的2
注意:正确的输出信息还是会输出到终端的,它只会把错误的信息重定向至目标文件。
正确和错误输出都输出到同一位置:混合输出
命令 &> 目标文件
:就表示将命令的所有输出结果都输出到目标文件中,并且会覆盖之前输出的内容命令 &>> 目标文件
:就表示将命令的所有输出结果都追加到目标文件中,是追加操作,不会覆盖之前的内容
eg:(/aaa文件夹不存在)
root@localhost ~]# ls /home/ /aaa &> log.txt
就会将命令的所有输出结果都输出在log.txt文件中。
命令可同时用:
[root@localhost ~]# ls /home/ /aaa 1> yes.txt 2> no.txt
表示将文件的正确输出输入到yes.txt文件中, 文件的错误输出输入到no.txt文件中
[root@localhost ~]# yum install httpd &> /dev/null
表示将输出内容放置到垃圾桶中。
输入重定向
有的时候我们需要向程序里输入信息,如发邮件:
- 发邮件
[root@localhost ~]# mail -s "邮件标题" 发给谁(需要是该计算机上的一个账号)
邮件内容-----------------第一行
邮件内容-----------------第二行
邮件内容-----------------第三行
.(邮件编辑完成符)
ETO
- 查看邮件
[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.Type ? for help.
"/var/spool/mail/alice": 1 message 1 new
>N 1 root wed Feb 19 14:53 22/845 "ss"
&
然后在&后面输入指定邮件的编号就可以查看对应邮件的内容,上面的邮件的编号就是1。
在终端编辑邮件是不太方便的,我们需要将一个文件中的内容作为邮件内容发送给用户,这个时候就需要使用输入重定向
。
输入重定向用到的符号是:目标输入位置 < 作为输入信息的文件
,表示将文件的文件的内容输入到目标位置。
输入重定向用到的符号是:目标输入位置 < 作为输入信息的文件
, 表示将文件的内容追加到目标位置
eg:邮件的内容编写在text.txt文件中,我们想要将该文件按中的内容发送给alice:
[root@localhost ~]# mail -s "输入重定向测试" alice < text.txt
输入重定向的作用:使用文件内容代替人为的输入
输入和输出重定向一起使用
eg:
cat > /2001/1.conf <<EOF
111111111111111
2222222222222
3333333333333
EDF
就是表示将
111111111111111
2222222222222
3333333333333
作为输入流输入,然后使用cat读取,然后将读取结果作为输出到文件1.conf文件中。
在这个命令中;
- <<EOF … EOF 表示可以输入换行信息
- 先指定输出命令,后指定输入命令也是ok的
管道 |
进程管道
管道命令可以将多条命令组合起来
,一次性完成复杂的处理任务, 命令之间使用|
进行连接
语法: 命令1 | 命令2 | 命令3 | ...
管道命令中,前一个命令的输出信息是下一个命令的输入信息
eg:
管道命令:
cat /etc/passwd | head -3
ps aux | grep 'sshd'
cat /etc/passwd | grep "root" | head -1
tee管道(三通管道)
三通管道就是在管道命令执行的过程中可以将任意一管道的输出结果保存下来,并且不影响管道的正常输出。语法:命令1 | 命令2 | ... | tee 要存储的目标位置| 命令n | ,,,
eg:cat /etc/passwd | tee file88.txt | tail -1
就是将 经过cat /etc/passwd
管道的数据保存在file88.txt 文件中
[root@localhost ~]# cat /etc/passwd | tee file88.txt | tail -1
user01:x:1001:1001::/home/user01:/sbin/nologin
[root@localhost ~]# cat file88.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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
参数传递Xargs
有一些特殊的命令,如 cp,rm
只能接受用户的标准输入,不接受从管道获取的文件数据,即不能跟在|
后面。但是我们可以使用|xargs
进行连接。|xargs
的作用就是将前一个管道的输输出转换成用户的标准输入格式,供 cp
等命令读取。
eg:
cat files.txt |xargs rm -rvf
表示将files.txt文件中的提到的文件删除。-v表示删除过程可视, -r 表示循环删除,-f 表示强制删除。