当前位置: 首页 > news >正文

Shell输入输出重定向

Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向。其实输入输出方向就是数据的流动方向:

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

在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器。

文件描述符

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

为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。

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

一、Shell输出重定向

输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。

这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。

Bash 支持的输出重定向符号如下:

在这里插入图片描述

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

注意:

  • 输出重定向的完整写法其实是 fd>file或者 fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1(一般都省略不写),也就是标准输出文件。
  • fd和>之间不能有空格,否则 Shell 会解析失败;>和file之间的空格可有可无。为了保持一致,我习惯在>两边都不加空格。

1、输出重定向

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

[root@centos7 tmp]# cat test.sh
#!/bin/bashfor str in "百度一下" "http://www.baidu.com/" "shell 重定向"
doecho $str >>demo.txt  #将输入结果以追加的方式重定向到文件
done
[root@centos7 tmp]# . ./test.sh
[root@centos7 tmp]# cat demo.txt
百度一下
http://www.baidu.com/
shell 重定向

示例2:将ls -l命令的输出结果以覆盖的方式重定向到 demo.txt 文件中。

[root@centos7 tmp]# ls -al > demo.txt
[root@centos7 tmp]# cat demo.txt
总用量 8
drwxrwxrwt. 16 root root 4096 33 12:28 .
dr-xr-xr-x. 18 root root  277 113 2020 ..
-rw-r--r--   1 root root    0 33 12:29 demo.txt
drwxrwxrwt.  2 root root    6 121 2019 .font-unix
drwxrwxrwt.  2 root root    6 121 2019 .ICE-unix
drwx------   3 root root   17 227 19:57 systemd-private-01c0359be41942aab784912371f5fcb3-chronyd.service-pRrdTO
drwx------   3 root root   17 221 21:02 systemd-private-2d952048e02047f29f26d09bae616d88-chronyd.service-h5EZOo
drwx------   3 root root   17 225 14:17 systemd-private-7ddedc75621a4db691dac9a29649e990-chronyd.service-jWYilL
drwx------   3 root root   17 33 12:21 systemd-private-dc9b832f5db048d5bccf835dd334075e-chronyd.service-kqZuRO
drwx------   3 root root   17 223 20:47 systemd-private-e2f2da87a7e945868423581f4b4e575a-chronyd.service-OebGxC
-rw-r--r--   1 root root  168 33 12:27 test.sh
drwxrwxrwt.  2 root root    6 121 2019 .Test-unix
drwx------   2 root root    6 227 19:57 vmware-root_8419-1688474274
drwx------   2 root root    6 33 12:21 vmware-root_8605-1948525539
drwx------   2 root root    6 225 14:17 vmware-root_8710-2857962208
drwx------   2 root root    6 223 20:47 vmware-root_8739-3844444291
drwxrwxrwt.  2 root root    6 121 2019 .X11-unix
drwxrwxrwt.  2 root root    6 121 2019 .XIM-unix
[root@centos7 tmp]#

2、错误输出重定向

示例:错误输出重定向举例

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

[root@centos7 tmp]# ls java 2> err.log
[root@centos7 tmp]# cat err.log
ls: 无法访问java: 没有那个文件或目录
[root@centos7 tmp]# ls java 2>> err.log
[root@centos7 tmp]# cat err.log
ls: 无法访问java: 没有那个文件或目录
ls: 无法访问java: 没有那个文件或目录

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

示例:把正确结果和错误信息都保存到不同文件中。

[root@centos7 tmp]# ls -l >>info.log 2>>error.log
[root@centos7 tmp]# ls java >>info.log 2>>error.log
[root@centos7 tmp]# cat info.log
总用量 12
-rw-r--r-- 1 root root 1362 33 12:29 demo.txt
-rw-r--r-- 1 root root  100 33 12:30 err.log
-rw-r--r-- 1 root root    0 33 12:33 error.log
-rw-r--r-- 1 root root    0 33 12:33 info.log
drwx------ 3 root root   17 227 19:57 systemd-private-01c0359be41942aab784912371f5fcb3-chronyd.service-pRrdTO
drwx------ 3 root root   17 221 21:02 systemd-private-2d952048e02047f29f26d09bae616d88-chronyd.service-h5EZOo
drwx------ 3 root root   17 225 14:17 systemd-private-7ddedc75621a4db691dac9a29649e990-chronyd.service-jWYilL
drwx------ 3 root root   17 33 12:21 systemd-private-dc9b832f5db048d5bccf835dd334075e-chronyd.service-kqZuRO
drwx------ 3 root root   17 223 20:47 systemd-private-e2f2da87a7e945868423581f4b4e575a-chronyd.service-OebGxC
-rw-r--r-- 1 root root  168 33 12:27 test.sh
drwx------ 2 root root    6 227 19:57 vmware-root_8419-1688474274
drwx------ 2 root root    6 33 12:21 vmware-root_8605-1948525539
drwx------ 2 root root    6 225 14:17 vmware-root_8710-2857962208
drwx------ 2 root root    6 223 20:47 vmware-root_8739-3844444291
[root@centos7 tmp]# cat error.log
ls: 无法访问java: 没有那个文件或目录

4、/dev/null文件

如果希望执行某个命令,你既不想把命令的输出结果保存到文件,又不想输出在屏幕上显示,干扰命令的执行,那么你把命令的所有结果重定向到 /dev/null 文件中。

command > /dev/null

可以把 /dev/null 当成 Linux 系统的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。

示例:

[root@centos7 tmp]# ls -l &>/dev/null
[root@centos7 tmp]#

二、Shell输入重定向

输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。

Bash 支持的输出重定向符号如下:

在这里插入图片描述

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

1、输入重定向

示例:逐行读取文件内容。

[root@centos7 tmp]# cat test2.sh
#!/bin/bashwhile read str; doecho $str
done <demo.txt
[root@centos7 tmp]# . ./test2.sh
百度一下
http://www.baidu.com/
shell 重定向
[root@centos7 tmp]#

2、分界符作为命令输入的结束标志

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

此处我们使用输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键。

示例:统计用户在终端输入的文本的行数。

[root@centos7 tmp]# wc -l <<END
> 1234
> asdf
> www
> baidu
> sss
> END
5
[root@centos7 tmp]#

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

– 求知若饥,虚心若愚。

相关文章:

  • 实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启
  • 14-Linux部署Hadoop集群
  • 高中数学:函数的单调性
  • 使用npm i命令时一直idealTree:npm: sill idealTree buildDeps卡住不动
  • 蓝桥杯倒计时41天!DFS进阶1——回溯
  • Vue+Flask电商后台管理系统
  • 【一起学习Arcade】(6):属性规则实例_约束规则和验证规则
  • 记录一次主机不能登录的异常现象解决的问题
  • 自动粘贴与网址管理,让您的网络生活更便捷!“
  • 04锁机制-分布式锁
  • 云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸
  • 人工智能_大模型013_AIGC生成式模型的增强检索_RAG知识补充检索_补充私域和实时场景知识_关键字检索增强---人工智能工作笔记0149
  • 基于yolov5的电瓶车和自行车检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】
  • 2403d,d的108版本更改
  • python爬虫之selenium知识点记录
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • axios 和 cookie 的那些事
  • ES学习笔记(12)--Symbol
  • learning koa2.x
  • LeetCode29.两数相除 JavaScript
  • Linux各目录及每个目录的详细介绍
  • React-Native - 收藏集 - 掘金
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Spring声明式事务管理之一:五大属性分析
  • vue-router 实现分析
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 日剧·日综资源集合(建议收藏)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 学习使用ExpressJS 4.0中的新Router
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 7行Python代码的人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (20050108)又读《平凡的世界》
  • (4)事件处理——(7)简单事件(Simple events)
  • (C)一些题4
  • (Git) gitignore基础使用
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转) Face-Resources
  • (转载)虚函数剖析
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***利用Ms05002溢出找“肉鸡
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • [2016.7 day.5] T2