[TOC]


思维导图

18-输入输出-重定向,dd,ulimit,tee_文件描述符

一、重定向

1、重定向定义

将原本要输出到屏幕上的内容,重新输入到其他设备中。

2、重定向的作用

(1)输出比较重要的内容时,我们把它保存到文件中。
(2)在后台执行程序,不想让它输出内容,干扰到屏幕。
(3)将定时任务的结果保存下来(备份,是否成功)
(4)一些执行的命令,知道它有错误输出,但是不想看错误输出。
(5)执行一个命令,可能报错和输出并存,类似于错误日志与标准正确的日志需要分别输出至不同的文件

3、命令返回值

如何判断一个命令是否成功?
echo $? 命令返回值
返回值为0,则代表上一条命令执行成功
返回值非0,则代表上一条命令执行不成功。
#
0 ? 02:40:03 root@yyds,10.0.0.100:<sub> # ll
total 4
drwxr-xr-x. 2 yyds zoo 22 Apr 11 04:33 moon
0 ? 02:40:13 root@yyds,10.0.0.100:</sub> # echo $?
0
1 ? 02:40:35 root@yyds,10.0.0.100:<sub> # ehco $?
-bash: ehco: command not found
127 ? 02:40:45 root@yyds,10.0.0.100:</sub> # echo $?
127

二、输入输出

1、文件描述符

内核(kernel)利用文件描述符(file descriptor)来访问文件。

1.系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件

2.每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。

3.习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2
#使用ulimit -n 可以查看当前的最大打开文件数
002:41:15 root@yyds,10.0.0.100:~ # ulimit -n
1024

名称

文件描述符

作用

stdin

0

标准输入

stdut

1

标准输出

stderr

2

错误输出

文件名

3+


003:14:15 root@yyds,10.0.0.100:<sub> # ps
PID TTY TIME CMD
1158 pts/0 00:00:00 bash
1558 pts/0 00:00:00 ps
003:16:32 root@yyds,10.0.0.100:</sub> # ll /proc/1158/fd
total 0
lrwx------. 1 root root 64 Apr 13 02:36 0 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 13 02:36 1 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 13 02:36 2 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 13 03:17 255 -> /dev/pts/0
rwx------. 1 root root 64 Apr 13 03:17 255 -> /dev/pts/0
003:17:03 root@yyds,10.0.0.100:<sub> # ll /dev/std*
lrwxrwxrwx. 1 root root 15 Apr 13 02:36 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 13 02:36 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 13 02:36 /dev/stdout -> /proc/self/fd/1

003:23:38 root@yyds,10.0.0.100:</sub> # find / -type d -name '*zls*' 1>/tmp/a.log 2>/tmp/b.log
003:24:19 root@yyds,10.0.0.100:<sub> # cat /tmp/a.log
/home/zls
003:24:29 root@yyds,10.0.0.100:</sub> # cat /tmp/b.log

2、输入输出符号

名称,

符号

作用

标准输入重定向

< 或 0<

将符号右边的内容交给符号左边的命令处理


<<或者0<<


标准输出覆盖重定向

>或者1>

将原本要输出在屏幕上的正确内容,覆盖重定向到文件中

标准输出追加重定向

>>或1>>

将原本要输出在屏幕上的内容,追加重定向到文件中

错误输出覆盖重定向

2>

将原本要输出在屏幕上的错误内容,覆盖到重定向文件中

错误输出追加重定向

2>>

将原本要输出到屏幕上的错误内容,追加到重定向文件中

3、输出重定向举例

003:41:02 root@yyds,10.0.0.100:<sub> # find / -type -d -name '*zls*' &> /tmp/a.txt
103:46:48 root@yyds,10.0.0.100:</sub> # find / -type -d -name '*zls*' > /tmp/b.txt 2>&1

3.1两条命令同时标准输出到同一个文件中

不需要创建一个文件,直接编辑一个文件名,其中date和ls中间用‘‘;’’

 0 ? 20:12:06 root@yyds,10.0.0.100:~ # (ls;date)>1.txt
0 ? 20:12:25 root@yyds,10.0.0.100:~ # cat 1.txt
1.txt
2.txt
a.txt
b.txt
djzlszz.txt
hdflshkld_zls
moon
python3
Python-3.10.4
yyds
zls
ZLS
ZLS.txt
Thu Apr 14 20:12:25 EDT 2022

4、输入重定向

003:57:54 root@yyds,10.0.0.100:<sub> # dd if=/dev/zero of=/1.txt bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.582884 s, 36.0 MB/s
bash: opt/disk: No such file or directory
104:10:46 root@yyds,10.0.0.100:</sub> # dd bs=1k count=1024 </dev/zero >1.txt
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00448707 s, 234 MB/s

三、双向重定向-tee

1、tee会同时将数据流分送文件与屏幕,而输出到屏幕的就是stdout,

tee -a  以累加(append)的方式,将数据加入file 当中,

          如果没有加a,则会覆盖原来的内容。

2、参数替换 xargs

作用:很多命令不支持管道命令,因此我们可以通过xargs来提供该命令使用标准输入。

12710:20:59 gg@yyds,10.0.0.100:~ $ cut -d ':' -f1  /etc/passwd|xargs -e'lp' -n 1 id
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)
uid=2(daemon) gid=2(daemon) groups=2(daemon)