重定向

1
将原本要输出到屏幕的数据信息,重新定向到指定的文件中。
1
2
3
4
5
6
#使用重定向场景
1.当屏幕输出的信息很重要,而且希望保存重要的信息时。
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时。
3.系统的例行命令,例如定时任务的执行结果,希望他可以存下来时。
4.一些执行命令,我们已经知道他可能出现错误信息,想将他直接丢弃时。
5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文件。

执行一个shell程序时通常会自动打开三个文件描述符

名称 文件描述符 作用
标准输入 (stdin) 0 通常是键盘,也可以是其他文件或者命令的输出的内容可以作为标准输入
标准输出 (stdout) 1 默认输出到屏幕
错误输出 (stderr) 2 默认输出到屏幕
文件名称 (filename) 3+
1
2
3
4
5
6
7
8
9
10
11
12
13
标准输入:stdin
标准输出:stdout
错误输出:stderr
[root@localhost ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stdout -> /proc/self/fd/1
文件描述符fd:一个命令或者程序在执行过程中,至少要打开4个文件描述符
文件描述符0:标准输入
文件描述符1:标准输出
文件描述符2:错误输出
文件描述符3+:文件名

输入输出 符号
标准输入重定向 < 或 0<
标准输出重定向 > 或 1>
错误输出重定向 2>

查看标准输入输出设备

1
2
3
4
[root@lb01 ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Apr 16 08:16 /dev/stderr -> /proc/self/fd/2 错误输出
lrwxrwxrwx. 1 root root 15 Apr 16 08:16 /dev/stdin -> /proc/self/fd/0 标准输入
lrwxrwxrwx. 1 root root 15 Apr 16 08:16 /dev/stdout -> /proc/self/fd/1 标准输出
类型 操作符 用途
标准覆盖输出重定向 1>或> 将命令的执行结果输出到指定的文件中, 而不是直接显示在屏幕上
标准追加输出重定向 >>1或1>> 将命令执行的结果追加输出到指定文件
错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中,会覆盖源文件内容
错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件中,不会覆盖源文件
标准输入重定向 << 将命令中接收输入的途径由默认的键盘更改为指定的文件

重定向使用

1
2
3
4
5
6
7
8
9
标准输出追加重定向
[root@lb01 ~]# echo "111" >>1.txt
标准输出覆盖重定向
[root@lb01 ~]# echo "111" >1.txt
错误输出覆盖重定向
[root@lb01 ~]# nginx -V 2>> 1.txt
错误输出追加重定向
[root@lb01 ~]# nginx -V 2> 1.txt

错误输出和正确输出,都输出到同一个文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 方法一:
[root@lb01 ~]# find /etc/ -type d > /tmp/1.log 2>/tmp/1.log
## 方法二:
标准输出到2.log文件里,错误输出到和标准输出一样位置
[root@lb01 ~]# find /etc/ -type d 1> /tmp/2.log 2>&1
和上面相反
[root@lb01 ~]# find /etc/ -type d 2> /tmp/6.log 1>&2
## 方法三:
[root@lb01 ~]# find /etc/ -type d &> /tmp/11.log


#将命令结果重定向到黑洞
[zls@localhost ~]$ find /etc/ -type d 1> /tmp/6.log 2>/dev/null 标准输出到6.log,错误输出到黑洞
[zls@localhost ~]$ find /etc/ -type d &>/dev/null 所有输出结果到黑洞

标准输出和错误输出到两个文件

1
find /etc -name "*.conf" 1>a 2>b

#将标准输出和标准错误输出重定向到同一个文件, 混合输出

1
2
3
4
5
[zls@zls ~]$ find /etc -name "*.conf" &>ab 
[zls@zls ~]$ find /etc -name "*.conf" >ab 2&>1
[zls@zls ~]$ find /etc -name "*.conf" >ab 2>&1
合并两个文件到一个文件
cat 1 2 >3

输入重定向

输入重定向,即原本从键盘等设备上获得的输入信息,重定向由命令的输出作为输入

1
2
3
4
5
6
7
[root@localhost ~]# cat >1.txt	等待键盘输入重定向到1.txt,Ctrl+c终止输入

[root@localhost ~]# cat <<EOF > 1.txt 等待键盘输入,遇到Eof结束重定向到1.txt
111
222
333
EOF

两条命令重定向

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# (ls;ifconfig) > /tmp/1.txt

## 将内容输出到文件,然后放后台执行 加个&
[root@localhost ~]# ping baidu.com &>/tmp/a.log &

扩展点: subshell
[root@zls ~]# cd /boot; ls
#subshell 中执行
[root@zls ~]# (cd /boot; ls)
#如果不希望某些命令的执行对当前 shell 环境产生影响,请在subshell中执行

管道技术

1
2
3
管道符作用:将管道符左边命令的标准输出交给管道符右边命令的标准输入来处理
1)左边命令他得是标准输出 1>
2)右边命令必须有标准输入

tee管道技术

image-20240416145607541

1
2
3
4
5
tee相当于开个侧门输出重定向到某个文件,原理见上图
[root@localhost ~]# echo $RANDOM|tee /dev/pts/3|passwd --stdin zls
[root@localhost ~]# echo $RANDOM|tee /tmp/pass.txt|passwd --stdin zls
## -a:append 追加到文件中
[root@localhost ~]# echo $RANDOM|tee -a /tmp/pass.txt|passwd --stdin zls

xargs传参

xaras后面不识别别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
xargs将管道符前面命令的标准输出,当成结果,放到管道符右边xargs后面的命令的后面执行
[root@localhost ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# echo {1..5}|xargs -n1
1
2
3
4
5
[root@localhost ~]# echo {1..10}|xargs -n2 -n2每两个一行 -n3每三个拍一行
1 2
3 4
5 6
7 8
9 10
[root@lb01 ~]# seq 10|xargs -n3
1 2 3
4 5 6
7 8 9
10

## 找出来的文件拷贝到/tmp
[root@localhost ~]# grep -rl 'xxx' ./|xargs cp -t /tmp/
[root@localhost ~]# grep -rl 'xxx' ./|xargs -I {} cp {} /opt

注意事项:
1.在管道后面的命令,都不应该在写文件名
2.在管道中只有标准输出才可以传递下一个命令, 标准错误输出会直接输出终端显示, 建议在使用管
道前将标准错误输出重定向。
例如: find /etc -name "*.conf" 2>/dev/null | grep rc
3.有些命令不支持管道技术, 但是可以通过 xargs 来实现管道传递。
例如: which cat|xargs ls-l
例如: ls |xargs rm -rvf
-I 选项作用是将前面输出结果打包到{}内
例如: ls |xargs cp -rvft /tmp/ ==> ls | xargs -I {} cp -rvf {} /tmp
例如: ls |xargs mv -t /tmp/ ==> ls | xargs -I {} mv {} /tmp
-a 设置从文件中读取数据
-d 设置自定义定界符
-l 设置替换字符串
-n 设置多行输出
-p 执行命令前询问用户是否确认
-r 如果输入数据为空,则不执行
-s 设置每条命令最大字符数
-t 显示xargs执行的命令