重定向符
一、输出重定向
标准输出的目标位置通常指向的是终端屏幕。可以使用>符号修改标准输出的目标位置。比如下面的示例就会将ps命令的输出重定向到result.txt文件。描述符和>之间不能有空格
$ ps > result.txt ←----- 由于已经重定向到 result.txt 文件,所以屏幕上不会输出任何内容 $ cat result.txt PID TTY TIME CMD 10745 pts/0 0000 bash 10873 pts/0 0000 ps
如果文件已经存在,则该文件会被覆盖,文件内容将丢失
如果不想使用>覆盖原文件,而想向原文件追加写入,可以使用>>重定向
$ echo line1 >> echo.txt $ echo line2 >> echo.txt $ echo line3 >> echo.txt $ cat echo.txt line1 line2 line3
重定向并不是命令的功能,而是shell的功能,只要命令能将执行结果输出到标准输出,就可以实现重定向。但是只有标准输出会被重定向,标准错误输出还是会直接显示到屏幕上,那么如何将错误输出重定向?
可以使用2>符号,数字2是称为文件描述符的编号
$ ls /xxx 2> error.txt $ cat error.txt ls: 无法访问'/xxx': 没有那个文件或目录
也就是说例子1中相当于是1>
或者2>>指令对错误进行重定向
$ ls /xxx 2>> error.txt $ cd /xxx 2>> error.txt $ cat error.txt ls: 无法访问 '/xxx': 没有那个文件或目录 -bash: cd: /xxx: 没有那个文件或目录
将标准输出和标准错误输出重定向到同一个文件(n>&m的含义是将文件描述符n设置为文件描述符m的副本)
$ ls /usr /xxx > ls_result.txt 2>&1
输出到不同文件(将ls命令的标准输出重定向到result.txt文件,并将标准错误输出重定向到error.txt文件)
$ ls /usr /xxx > result.txt 2> error.txt
使用分组命令重定向(如果想在使用{ }时将多条命令写到一行,需要在每条命令后面加上;)
#!/bin/bash { date +%Y-%m-%d echo '/usr list' ls /usr } > result.txt #------------------------------------------------------------ $ { date +%Y-%m-%d; echo '/usr list'; ls /usr; } > result.txt
分组命令的{后面要有空格,还可以使用( )代替{ }
二、输入重定向
$ tr b B abcd ←----- 从键盘输ru aBcd ←----- b 被替换为 B my book ←----- 从键盘输入 my Book ←----- b 被替换为 B
tr命令对键盘输入的东西进行替换吧
$ cat word.txt abcd ←----- word.txt 文件的内容 my book $ tr b B < word.txt ←----- 将 word.txt 文件重定向为输入源省略0< aBcd my Book
管道
命令的输出内容除了可以重定向输出到文件,还可以作为其他命令的输入使用。
使用less命令显示ls命令的标准输出内容
$ ls | less ... <-----(本行及以下5行)less 命令输出示例 Documents Movies Music Public (END)
等效于
$ ls > result.txt $ less < result.txt
注意:管道只会将前一条命令的标准输出传递给之后的命令,而第1条命令的标准错误输出则不会传递给后面的命令。
$ ls /usr/bin | grep 'py' | wc -l 6
如果使用管道来连接一个同时显示标准输出和标准错误输出的命令,那么屏幕上将只显示标准错误输出的内容。如果想将标准错误输出和标准输出一起传递给后面的命令,那么使用前面介绍的2>&1这种重定向方式即可
$ ls /usr /xxx 2>&1 | less ls: 无法访问'/xxx': 没有那个文件或目录
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !