- 首先用一个例子来描述重定向的含义:
在生产环境中,每天凌晨需要备份娄据库,这时工作人员会编写一个简单的脚本创建计划任务,把脚本执行结果放到一个或几个文件中以便第二天查看,这个过程就叫重定向。在使用“psaux”命令时,为了快速找到所需信息,经常使用grep命令进行过滤,此时就需要使用管道符。
下面是一些进行I/O重定向的基本命令操作:
1.查看自己是第几个终端:
[root@qfedu~]# tty
2.显示当前时间:
[root@qfedu~]# date
如果在date后面添加>指向此文件,即定向于此文件:
[root@qfedu~]# date > date.txt
3.在输入ls查看/proc虚拟文件时,文件后面经常有->符号,以及0,1,2这三个数字,这些又代表什么含义呢?
其实这些是绝大多数进程都有的,其中0表示标准输入,可以理解为键盘输入;1表示标准输出,输出到终端;2表示标准错误,输出到终端;3及以上为常规文件的描述符。
具体如下图:
例如,date命令在默认情况下将输出结果显示在终端,此时文件描述符为1。现在改变输出的方向,从终端改为date.txt文件,这个行为叫作重定向,具体如下所示。
4.重定向:[root@qfedu~]# date 1> date.txt
改变文件描述符为2(标准错误),如果命令正确,结果在终端显示,如果命令错误,结果会输出在终端上,再重新定向到date文件中,即将错误信息写入文件中。
[root@qfedu~]# date 2> date.txt
显示时间
[root@qfedu~]# linux 2> date.txt
[root@qfedu~]# cat date.txt
bash:linux:未找到命令...(错误信息)
文件描述符为0,表示为标准输入:
[root@qfedu~]# cat 0< (重定向的路径)
文件描述符的含义见下图:
输出重定向分为正确与错误输出两种:
正确输出:1>,1>>;(1可省略)
错误输出:2>,2>>;
>表示覆盖,>>表示追加。
5.输出重定向(覆盖)
[root@qfedu~]# date 1> date.txt (date结果输出到date文件)
6.输出重定向(追加)
[root@qfedu~]# date >> date.txt(在文件尾部追加)
7.错误重定向:
[root@qfedu~]# ls /home/linux 2> error.txt (前提是/home/linux不存在,这样才会输出错误信息)
综合应用:
8.正确结果与错误结果都输出到相同位置:
[root@qfedu~]# ls /home/ /linux &>list.txt
9.正确结果与错误结果都输出重定向到相同位置:
[root@qfedu~]# ls /home/ /linux >list.txt 2>&1
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n
<&- 关闭标准输入(键盘)
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭
10.输入重定向:
使用grep命令过滤root,输入端默认为键盘,接着将输入重定向到/etc/passwd。
[root@qfedu~]# grep ‘root’
linux
wwww.qfedu.com
[root@qfedu~]# grep 'root' </etc/passwd
11.dd命令读取数据:
[root@qfedu~]# dd if = /dev/zero of=/file01.txt bs=1M count2 (bs为每次写入多大的信息,count是一共写多少次)
拓展:
cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
他们的不同点在于:
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。
重定向综合案例:
利用重定向建立多行文件(命令行)。
(1)使用 echo 命令重定向并不能建建立多行文件,一般使用cat 命令,在键盘上输入文本按回车键换行,完成后按组合键Ctrl+d 结束。
“>”表示覆盖,但在此处是指覆盖原来的file03.txt,输入的3 行文本一次输出到 file03.txt。如果退出后再次输出,那将覆盖掉先前的文本内容,此时就需要用“>>”进行追加。
(2)每次写入文本都需要按组合键Ctr 1+d 结束显得比较烦琐,用户可以自定义 个结束的符号,通常使用“EOF”。
利用重定向建立多行文件(脚本)。
(3)命令行和脚本都可以操纵Shell。 在命令行中可以用组合键Ctrl+d退出, 但在脚本中不可以。下面利用脚本创建多行文件,在脚本文件中写入文本,并加入“EOF”结束符号。
(4)使用bash执行脚本
(5)在编写脚本时,为排版整齐,经常在EOF前面使用tab键缩进,同时输入重定向符后添加“-”。
多条命令输出重定向
(6)如果需要将两条命令输出都重定向,则需要添加括号:
(7)让命令在后台运行,并且输出重定向到文件。
(8)终止后台程序:
管道综合案例
管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制车输出到其他程序。管道的作用是把上一个进程的]输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起
将/etc/passwd中的用户按UID数值大小排序并显示前3行
统计出最占CPU的5个进程
以上就是关于Linux--I/O重定向与管道的一些基本内容了。
标签:输出,重定向,文件,--,qfedu,Linux,date,root From: https://www.cnblogs.com/swxyoushijie/p/17860240.html