Shell重定向(输入输出重定向)

转:https://blog.csdn.net/lz6363/article/details/95813668?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-4-95813668.nonecase


Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思。

那么,什么是输入输出方向呢?标准的输入输出方向又是什么呢?

一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序、Shell 脚本程序等)中使用;这就是标准的输入方向,也就是从键盘到程序。

反过来说,程序中也会产生数据,这些数据一般都是直接呈现到显示器上,这就是标准的输出方向,也就是从程序到显示器。

我们可以把观点提炼一下,其实输入输出方向就是数据的流动方向:

输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。

硬件设备和文件描述符

计算机的硬件设备有很多,常见的输入设备有键盘、鼠标、麦克风、手写板等,输出设备有显示器、投影仪、打印机等。不过,在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器。

Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。

为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。在这里插入图片描述
表1:与输入输出有关的文件描述符

Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。

stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用

Linux Shell 输出重定向

输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。Bash 支持的输出重定向符号如下表所示。
在这里插入图片描述
表2:Bash 支持的输出重定向符号

在输出重定向中,>代表的是覆盖,>>代表的是追加。

注意
输出重定向的完整写法其实是fd>file或者fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。

当文件描述符为 1 时,一般都省略不写,如上表所示;当然,如果你愿意,也可以将command >file写作command 1>file,但这样做是多此一举。

当文件描述符为大于 1 的值时,比如 2,就必须写上。

需要重点说明的是,fd和>之间不能有空格,否则 Shell 会解析失败;>和file之间的空格可有可无。为了保持一致,我习惯在>两边都不加空格。

下面的语句是一个反面教材:
echo “fuyun” 1 >log.txt

注意1和>之间的空格。echo 命令的输出结果是fuyun,我们的初衷是将输出结果重定向到 log.txt,但是当你打开 log.txt 文件后,发现文件的内容为fuyun 1,这就是多余的空格导致的解析错误。也就是说,Shell 将该条语句理解成了下面的形式:
echo “fuyun” 1 1>log.txt

输出重定向举例

将 echo 命令的输出结果以追加的方式写入到 demo.txt 文件中。

#!/bin/bash
for str in "fuyun6363" "博客地址" "https://blog.csdn.net/lz6363" "欢迎访问"
do
    echo $str >>/home/fuyun/datas/demo.txt  #将输入结果以追加的方式重定向到文件
done

运行以上脚本,使用cat demo.txt查看文件内容,显示如下:
fuyun6363
博客地址
https://blog.csdn.net/lz6363
欢迎访问

ls -l命令的输出结果重定向到文件中。

[fuyun@bigdata-training datas]$ ls -l  #先预览一下输出结果
total 106564
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04bj_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04nj_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04sh_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04sz_2nd_house_price.csv
-rw-rw-r-- 1 fuyun fuyun 39425518 May  8  2017 2015082818
-rw-rw-r-- 1 fuyun fuyun 37091848 May  8  2017 2015082819
-rw-r--r-- 1 fuyun fuyun  9758694 May  7  2018 20151220.log
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_01.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_01_nj.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_02.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_02_nj.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Sep  6  2017 2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_nj.csv
-rw-r--r-- 1 fuyun fuyun   174449 Jan 16  2016 access_log
-rw-r--r-- 1 fuyun fuyun       79 Sep  5  2017 dept.txt
-rw-r--r-- 1 fuyun fuyun      656 Sep  5  2017 emp.txt
-rwxrwxr-x 1 fuyun fuyun      325 Feb 25 04:55 fun_factorial1.sh
-rwxrwxr-x 1 fuyun fuyun      488 Feb 25 04:49 fun_factorial.sh
-rw-rw-r-- 1 fuyun fuyun       23 Mar 27  2018 hehe.txt
-rw-rw-r-- 1 fuyun fuyun     1006 Aug  1  2018 log
drwxrwxr-x 2 fuyun fuyun     4096 Jul  8  2018 product_info
-rw-rw-r-- 1 fuyun fuyun      386 Aug  1  2018 result
-rw-rw-r-- 1 fuyun fuyun       20 Mar 22  2018 sort.txt
-rw-r--r-- 1 fuyun fuyun   318533 Sep  5  2017 sw17-top11-dl-sh.anon.csv
-rw-rw-r-- 1 fuyun fuyun      187 Jul 25  2018 test.txt
drwxrwxr-x 2 fuyun fuyun     4096 Jul  8  2018 user_visit_action
-rw-rw-r-- 1 fuyun fuyun      176 Apr  9  2018 wordcount.data
-rw-r--r-- 1 fuyun fuyun       59 Mar 25  2018 words.data
-rw-rw-r-- 1 fuyun fuyun     5874 Feb 25 01:01 xinzeng_tb
[fuyun@bigdata-training datas]$ ls -l >/home/fuyun/datas/demo.txt #重定向
[fuyun@bigdata-training datas]$ cat demo.txt 
total 106564
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04bj_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04nj_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04sh_2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Apr  2  2018 04sz_2nd_house_price.csv
-rw-rw-r-- 1 fuyun fuyun 39425518 May  8  2017 2015082818
-rw-rw-r-- 1 fuyun fuyun 37091848 May  8  2017 2015082819
-rw-r--r-- 1 fuyun fuyun  9758694 May  7  2018 20151220.log
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_01.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_01_nj.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_02.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_02_nj.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Sep  6  2017 2nd_house_price.csv
-rw-r--r-- 1 fuyun fuyun  2225947 Mar 25  2018 2nd_house_price_nj.csv
-rw-r--r-- 1 fuyun fuyun   174449 Jan 16  2016 access_log
-rw-r--r-- 1 fuyun fuyun       79 Sep  5  2017 dept.txt
-rw-r--r-- 1 fuyun fuyun      656 Sep  5  2017 emp.txt
-rwxrwxr-x 1 fuyun fuyun      325 Feb 25 04:55 fun_factorial1.sh
-rwxrwxr-x 1 fuyun fuyun      488 Feb 25 04:49 fun_factorial.sh
-rw-rw-r-- 1 fuyun fuyun       23 Mar 27  2018 hehe.txt
-rw-rw-r-- 1 fuyun fuyun     1006 Aug  1  2018 log
drwxrwxr-x 2 fuyun fuyun     4096 Jul  8  2018 product_info
-rw-rw-r-- 1 fuyun fuyun      386 Aug  1  2018 result
-rw-rw-r-- 1 fuyun fuyun       20 Mar 22  2018 sort.txt
-rw-r--r-- 1 fuyun fuyun   318533 Sep  5  2017 sw17-top11-dl-sh.anon.csv
-rw-rw-r-- 1 fuyun fuyun      187 Jul 25  2018 test.txt
drwxrwxr-x 2 fuyun fuyun     4096 Jul  8  2018 user_visit_action
-rw-rw-r-- 1 fuyun fuyun      176 Apr  9  2018 wordcount.data
-rw-r--r-- 1 fuyun fuyun       59 Mar 25  2018 words.data
-rw-rw-r-- 1 fuyun fuyun     5874 Feb 25 01:01 xinzeng_tb

错误输出重定向举例

命令正确执行是没有错误信息的,我们必须刻意地让命令执行出错,如下所示:

[fuyun@bigdata-training datas]$ ls java  #先预览一下错误信息
ls: cannot access java: No such file or directory
ls java 2>/home/fuyun/datas/err.log  #重定向
[fuyun@bigdata-training datas]$ cat err.log 
ls: cannot access java: No such file or directory

正确输出和错误信息同时保存

把正确结果和错误信息都保存到一个文件中,例如:

[fuyun@bigdata-training datas]$ ls -l >/home/fuyun/datas/out.log 2>&1
[fuyun@bigdata-training datas]$ ls java >>out.log 2>&1
[fuyun@bigdata-training datas]$ cat out.log
total 8
-rw-rw-r-- 1 fuyun fuyun 1847 Jul  8 11:11 demo.txt
-rw-rw-r-- 1 fuyun fuyun   50 Jul  8 11:15 err.log
-rw-rw-r-- 1 fuyun fuyun    0 Jul  8 11:16 out.log
ls: cannot access java: No such file or directory

out.log 的最后一行是错误信息,其它行都是正确的输出结果。

上面的实例将正确结果和错误信息都写入同一个文件中,这样会导致视觉上的混乱,不利于以后的检索,所以我建议把正确结果和错误信息分开保存到不同的文件中,也即写成下面的形式:
ls -l >>/home/fuyun/datas/out.log 2>>err.log
这样一来,正确的输出结果会写入到 out.log,而错误的信息则会写入到 err.log。

/dev/null 文件

如果你既不想把命令的输出结果保存到文件,也不想把命令的输出结果显示到屏幕上,干扰命令的执行,那么可以把命令的所有结果重定向到 /dev/null 文件中。如下所示:
ls -l &>/dev/null
大家可以把 /dev/null 当成 Linux 系统的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。

Linux Shell 输入重定向

输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
在这里插入图片描述
表3:Bash 支持的输出重定向符号

和输出重定向类似,输入重定向的完整写法是fd<file,其中 fd 表示文件描述符,如果不写,默认为 0,也就是标准输入文件。

输入重定向举例

统计文档中有多少行文字。

Linux wc命令可以用来对文本进行统计,包括单词个数、行数、字节数,它的用法如下:
wc [选项] [文件名]

其中,-c选项统计字节数,-w选项统计单词数,-l选项统计行数。

统计 demo.txt 文件中有多少行文本:

[fuyun@bigdata-training datas]$ cat demo.txt 
fuyun6363
博客地址
https://blog.csdn.net/lz6363
欢迎访问

逐行读取文件内容。

[fuyun@bigdata-training shell]$ cat readme.sh 
#!/bin/bash
while read str; do
    echo $str
done </home/fuyun/datas/demo.tx

[fuyun@bigdata-training shell]$ sh readme.sh 
fuyun6363
博客地址
https://blog.csdn.net/lz6363
欢迎访问

这种写法叫做代码块重定向,也就是把一组命令同时重定向到一个文件。

统计用户在终端输入的文本的行数。
此处我们使用输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键。

[fuyun@bigdata-training shell]$ wc -l <<END
> fuyun
> hive
> shell
> linux
> java
> spark
> END
6

wc命令会一直等待用输入,直到遇见分界符 END 才结束读取。

<<之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入(不包括分界符本身)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_kerneler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值