shell脚本基础:重定向和管道符

描述

重定向符

一、输出重定向

标准输出的目标位置通常指向的是终端屏幕。可以使用>符号修改标准输出的目标位置。比如下面的示例就会将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': 没有那个文件或目录

 

Shell

也就是说例子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': 没有那个文件或目录

 

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分