linux的输入输出重定向
一、输出重定向
#输出重定向介绍当输入一个命令之后,回车,命令产生了结果,结果默认是输出到屏幕上的。默认情况,无论一个带有输出的命令执行正确与否,结果都会默认输出到屏幕上。在有些情况下,我可能需要保留命令或者脚本输出的结果来当做日志(log),用作后面分析。这就是我们要将命令或者脚本产生的结果保存下来的意义。#正确的输出重定向cat /etc/hosts 产生的结果是正确的,我们可以使用>和>>将这个命令正确的结果输出到一个文件中。cat /etc/hosts > /root/file1 就是将">"前面命令的结果送到/root/file1文件中,而不是屏幕上。注意:任何能产生输出的命令都可以使用重定向,如果一个命令没有输出,那么重定向是没有意义的。>和>>都能对正确的输出进行重定向,都能将正确的结果重定向到文件中,区别是>会将指向的文件内容完全覆盖,>>会将重定向的内容追加到指定的文件,>就是正确的覆盖,>>就是正确的追加#错误的输出重定向2>就是错误的覆盖2>>就是错误的追加#错误的输出重定向2>就是错误的覆盖2>>就是错误的追加#一条命令的输出既有正确的又有错误的[overtimer@centos79-68-78 ~]$ find / -name test/usr/bin/test/usr/lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/ntb/test/usr/lib64/python2.7/test/usr/lib64/python2.7/unittest/testfind: ‘/usr/share/polkit-1/rules.d’: Permission deniedfind: ‘/usr/libexec/initscripts/legacy-actions/auditd’: Permission denied/usr/src/kernels/3.10.0-1160.el7.x86_64/drivers/ntb/test上面的这条命令因为作为一个普通用户,进行全根搜索大多情况下是没有意义的,因为系统里面有大量的目录对普通用户是无法访问的,自然也无法查看对应的文件,但是也有很多的目录是可以进入查看文件的,因此,上面的命令会有大量的错误输出,并且里面夹杂着一些正确的找到的符合结果的文件。这种情况就是经典的一个命令既带有正确的结果,也有错误的结果,我们可能期望的是正确的结果,也可能要对错误的结果进行分析,你可以通过正确的输出重定向将正确的输出流保存下来,也可以通过错误的输出重定向将错误的输出流保存下来用作后续分析。1)我们只使用>不是使用2>:[overtimer@centos79-68-78 ~]$ find / -name test > find-correct.txt发现现在的输出全是错误的,没有正确的。find: ‘/usr/libexec/initscripts/legacy-actions/auditd’: Permission deniedfind: ‘/home/postgres’: Permission deniedfind: ‘/home/networkmgr’: Permission deniedfind: ‘/opt/rbm/middleware/nginx’: Permission deniedfind: ‘/opt/rbm/middleware/postgresql/data’: Permission deniedfind: ‘/opt/rbm/pgbackrest/repo/archive’: Permission deniedfind: ‘/opt/rbm/pgbackrest/repo/backup’: Permission denied[overtimer@centos79-68-78 ~]$ [overtimer@centos79-68-78 ~]$ [overtimer@centos79-68-78 ~]$ [overtimer@centos79-68-78 ~]$ cat find-correct.txt /usr/bin/test/usr/lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/ntb/test/usr/lib64/python2.7/test/usr/lib64/python2.7/unittest/test/usr/src/kernels/3.10.0-1160.el7.x86_64/drivers/ntb/test/usr/src/kernels/3.10.0-1160.el7.x86_64/include/config/test/usr/src/kernels/3.10.0-1160.el7.x86_64/lib/raid6/test/opt/rbm/middleware/postgresql/lib/pgxs/src/test2)我们同时使用>和2>[overtimer@centos79-68-78 ~]$ find / -name test > find-correct.txt 2>find-false.txt可以发现屏幕是没有输出的。[overtimer@centos79-68-78 ~]$ head -3 find-correct.txt /usr/bin/test/usr/lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/ntb/test/usr/lib64/python2.7/test[overtimer@centos79-68-78 ~]$ head -3 find-false.txt find: ‘/boot/efi/EFI/centos’: Permission deniedfind: ‘/boot/grub2’: Permission deniedfind: ‘/proc/tty/driver’: Permission denied#所有结果输出重定向&>正确错误都覆盖&>>正确错误都追加有些时候我们不太在乎你当前的执行结果是正确的还是错误的,但是我必须要将他们保存下来,用作后续的分析#特殊设备,黑洞文件/dev/null/dev/null是一个特殊的文件,如果将重定向指向这个文件,那么就相当于将执行结果送到黑洞中,直接没了。有些时候,我们不关心命令的某些输出结果,不想让命令的输出显示到任何地方,我们就可以通过重定向符号将输出送到黑洞中。如果所有输出都送到黑洞文件中可以使用如下方式命令&>> /dev/null如果只是希望错误的输出送到黑洞文件中可以使用如下方式命令2>> /dev/null

#将错误的流变成正确的流[overtimer@centos79-68-78 ~]$ find / -name test >all.txt 2>&1其实就是把所有的输出(对的和错的)都重定向到文件里,和&>一样
二、输入重定向
#输入重定向背景 在计算机发展早期,程序与用户之间的交互主要依赖于标准输入(通常是键盘)和标准输出(通常是屏幕)。但随着计算机处理的数据量不断增大,以及自动化任务的需求日益增长,单纯依靠人工从键盘输入数据变得效率低下且容易出错。为了解决这些问题,输入重定向的概念应运而生。它允许程序从文件、其他程序的输出或者特殊设备中获取输入数据,而不仅仅局限于键盘,从而提高了数据处理的效率和自动化程度。 #输入重定向定义 输入重定向是一种机制,它改变了程序获取输入数据的来源。通常情况下,程序默认从标准输入(如键盘)读取数据,但通过输入重定向,程序可以从文件、管道或其他数据源读取数据。 #交互式命令和非交互式命令介绍 交互式命令是指在执行过程中需要用户与命令进行交互的命令。用户通过输入信息、回答问题或选择选项等方式来与命令进行交互,以完成特定的任务。如vi、nano、bash等命令都是交互式命令。 非交互式命令是指在执行过程中不需要用户直接干预,而是按照预先设定的参数和指令自动执行的命令。这些命令通常用于批量处理任务、脚本编写或在后台运行。比如cp,mv,rm等文件管理命令。 输入重定向可以将某些交互式命令转换成非交互式命令。通过输入重定向,可将命令的输入来源从默认的标准输入(通常是键盘)重定向到文件或其他输出源,从而实现命令执行过程无需人工实时输入。 #输入重定向 < 无处不在 其实无论是cat命令还是grep命令都是等待用户提供数据的命令,只不过cat是1比1将用户提供的输入进行输出,grep命令是将用户提供的输入进行筛选后进行输出。所谓的cat和grep指定文件,本质上是通过输入重定向将文件的内容作为输入送给命令带代替用户通过键盘输入。 cat< example.txt grep"apple"< fruits.txt #输入重定向<<基础使用 << 输入重定向,它被称为HereDocument。它允许用户在命令行中直接输入多行文本作为命令的输入,而无需从文件中读取。 Here Document 的基本语法如下: command << delimiter 这里是输入的文本内容 可以有多行 delimiter delimiter 是用户自定义的分隔符,用于标识输入文本的开始和结束。当命令遇到 delimiter 时,它会将之前输入的所有文本作为标准输入传递给 command。 #最经典的<<示例 cat << END 这是第一行文本。 这是第二行文本。 END 上述命令中,cat 命令会将 << END 和 END 之间的文本内容输出到终端。Here Document 常用于需要向命令提供多行输入的场景,如向文本处理命令提供模板文本,或向交互式程序提供一系列输入等。 #经典中的经典-<<和输出重定向的结合 cat > /tmp/file1.txt <任何你在file1.txt文件中添加的内容 内容行1 内容行2 ... 内容行n END 这个delimiter,也就是上面的END是可以随意替换的,只要上下都是一样的就行,比如: cat > /tmp/file1.txt <任何你在file1.txt文件中添加的内容 内容行1 内容行2 ... 内容行n EOF #shell脚本的思想 1.shell脚本其实就是Linux命令的集合体 2.一个shell脚本里面可以有N个Linux命令 3.shell脚本里面要尽可能的是非交互式命令 4.这样才能让脚本在不需要人参与的情况下"自己动"