『忘了再学』Shell基础 — 6、Bash基本功能(输入输出重定向)
1、Bash的标准输入输出
我们前边一直在说,在Linux系统下,一切皆是文件,键盘和显示器等硬件都是文件,如下图:

从上图中可以看出,键盘的设备文件名为/dev/stdin,显示器标准正确输入的设备文件名为/dev/stdout,显示器标准错误输入的设备文件名为/dev/stderr。
这些设备文件名非常不好记忆,Shell允许我们用文件描述符来描述对应的设备,也就是用0、1、2,分别对应键盘、正确显示器,错误显示器。
2、输出重定向
什么叫输出重定向?
命令的输出,是输出给标准输出的,也就是输出到显示器上。而输出重定向就是命令的输出,不输出给标准输出,而是把输出的内容,输出到文件中。
(1)标准输出重定向
命令 > 文件:以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。命令 >> 文件:以追加的方式,把命令的正确输出,输出到指定的文件或设备当中。
示例如下:
# 覆盖的方式
[root@localhost ~]# pwd > abc
[root@localhost ~]# cat abc
/root
# 追加的方式
[root@localhost ~]# pwd >> abc
[root@localhost ~]# cat abc
/root
/root
只要该命令有结果,都能够输进行输出重定向。
(2)标准错误输出重定向
如果执行的命令出现报错,用上边的方式是不能够进行输出内容重定向的,错误信息会直接输出到标准错误输出,如下:
[root@localhost ~]# lsdgagsa >> abc
-bash: lsdgagsa: command not found
错误命令 2>文件:以覆盖的方式,把命令的错误输出,输出到指定的文件或设备当中。错误命令 2>>文件:以追加的方式,把命令的错误输出,输出到指定的文件或设备当中。
这个2是文件描述符,表示标准错误输出,看上表。
示例如下:
[root@localhost ~]# lsdgagsa 2>> abc
[root@localhost ~]# cat abc
/root
/root
-bash: lsdgagsa: command not found
这里需要注意的是,上边的标准正确输出和标准错误输出的重定向有一些小问题,就是我要事先知道这条命令是否报错,才能选择是使用标准正确输出还是使用标准错误输出。
这样十分不合理,我明知道命令会报错,那我直接写对不就完了。所以我们在工作中写脚本的时候,常用的输出重定向的方式是下面的方式。
(3)正确输出和错误输出同时保存
方式一
命令 > 文件 2>&1:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。命令 >> 文件 2>&1:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)
示例如下:
# 把ls命令的查询结果覆盖存储到abc文件中
[root@localhost ~]# ls > abc 2>&1
[root@localhost ~]# cat abc
anaconda-ks.cfg
install.log
install.log.syslog
# 把错误信息追加存储到abc文件中
[root@localhost ~]# lsadfgag >> abc 2>&1
[root@localhost ~]# cat abc
anaconda-ks.cfg
install.log
install.log.syslog
-bash: lsadfgag: command not found
命令 >> 文件 2>&1的意思是,把命令的正确输出,输出到文件中,然后把命令的错误输出,输出到正确输出的文件中。
方式二
命令 &>文件:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。命令 &>>文件:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)
示例如下:
# 把pwd命令的结果覆盖存储到abc文件中
[root@localhost ~]# pwd &> abc
[root@localhost ~]# cat abc
/root
# 把错误信息追加存储到abc文件中
[root@localhost ~]# lsadfgag &>> abc
[root@localhost ~]# cat abc
/root
-bash: lsadfgag: command not found
方式三
命令>>文件1 2>>文件2:把正确的输出追加到文件1中,把错误的输出追加到文件2中。(常用)

统一保存和分开保存看你习惯。
注意,在正确输出的时候
>或者>>两边是可以有空格的,如果是错误输出的时候,2和>或者>>之间是不能有空格的。如下,提示语法错误。
[root@localhost ~]# lsgdagasasd >> abc 2 > &1
-bash: syntax error near unexpected token `&’
3、输入重定向
输入重定向就是<。意思是命令的输入是由标准输入输入的,也就是由键盘输入的。输入重定向就是改变输入方向,不在由键盘作为输入,而拿文件作为命令的输入。(输入重定向比较少见)
我们只在之前给源码包打补丁的patch命令(文章https://www.cnblogs.com/liuyuelinfighting/p/15574188.html),和RPM源码包文件提取中的cpio命令用到过。
双<<号用的就更少了,基本没有实际的应用。

uio就相当于一个分界符,在两个uio中间的内容,输入给wc命令,进行统计。
『忘了再学』Shell基础 — 6、Bash基本功能(输入输出重定向)的更多相关文章
- 『忘了再学』Shell基础 — 2、Shell的作用与分类
目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...
- 『忘了再学』Shell基础 — 3、echo命令的介绍与使用
目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- 『忘了再学』Shell基础 — 25、扩展正则表达式
目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...
- 『忘了再学』Shell基础 — 30、sed命令的使用
目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...
- 『忘了再学』Shell基础 — 1、Shell的介绍
目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...
- 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)
目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...
- 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)
目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...
随机推荐
- Three.js之绘制中文文字并跟随物体
本周更新的需求是物体上显示文字信息,效果图如下: 加载字体 import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js'; ...
- Android编译优化系列-kapt篇
作者:字节跳动终端技术---王龙海 封光 兰军健 一.背景 本文是编译优化系列文章之 kapt 优化篇,后续还会有 build cache, kotlin, dex 优化等文章,敬请期待.本文由Cli ...
- JAVA 猜拳游戏
JAVA 猜拳游戏 题目:通过控制台方式实现一个人机对战的猜拳游戏 用户通过输入(0.石头子 1.剪刀 2.布),机器随机生成(0.石头子 1.剪刀 2.布) 要求: 能打印玩家的对局信息,胜利的次数 ...
- tp5手机号验证码发送及验证
原文链接:https://blog.csdn.net/weixin_43389208/article/details/119153323 为什么使用短信: 场景:通常在使用手机号注册时需要发送短信验证 ...
- java面试:java基础、Io、容器
1.java基础 1.JDK 和JRE有什么区别 JDK:java开发工具包,java开发运行环境.包含了JRE. JRE:java运行环境,包含java虚拟机,java基础类库. 2.jav ...
- BBS项目分布搭建二(个人站点相关)
BBS项目分布搭建二 1. 首页详情补充 # 在home.html文件中 body标签内补充: <div class="container-fluid"> <di ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- Android系统编程入门系列之硬件交互——通信硬件电信SIM卡
现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...
- 通过Geth搭建私有以太坊网络
前言 为了进一步了解以太坊区块链网络的工作方式和运行原理,笔者通过官方软件Geth搭建了私有以太坊网络fantasynetwork,最终实现了单机和多机节点间的相互连通:首先通过VMware Work ...
- 在/etc/docker/下 创建daemon.json重新加载后docker无法启动问题 /etc/docker/daemon.json编辑不了 找不到
可能产生这个问题的原因至少有以下几个: 编辑daemon.json步骤不对:想要创建并编辑daemon.json,应该是先启动docker服务,此时系统自动产生/etc/docker目录,此时cat生 ...