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基本功能(输入输出重定向)的更多相关文章

  1. 『忘了再学』Shell基础 — 2、Shell的作用与分类

    目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...

  2. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  3. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  4. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  5. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

  6. 『忘了再学』Shell基础 — 30、sed命令的使用

    目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...

  7. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  8. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

  9. 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)

    目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...

随机推荐

  1. 案例二:shell脚本获取当前日期和时间及磁盘使情况

    习题分析 本题有两个核心知识点: 1. 如何自动表示当天的日期 2. 磁盘使用情况 打印日期的命令为 date,示例命令如下: # date 2017 年 12 月 20 日 星期三 16:26:55 ...

  2. 【C#基础概念】字面量 literal

    一.字面量定义 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation).几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串:而有很 ...

  3. idea maven: invalid class root

    maven导入依赖没有问题,但是项目lib的类飘红,实际导入的类中有一些没有,这是idea的问题,重启idea,发现需要重新导入项目,重新导入后问题解决. 原因:可能之前误删了项目中idea的一些文件 ...

  4. gvim 配置vimrc

    ##################################################################### normal setup################## ...

  5. WPF优秀组件推荐之Stylet(二)

    上一篇文章介绍了Stylet的一些基本功能,本篇将介绍一些深入一点的功能. 依赖注入 在Bootstrapper 类中注入需要的对象: public class Bootstrapper : Boot ...

  6. LeetCode-086-分隔链表

    分隔链表 题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前. 你应当 保留 两个分区中每个节点的初始相对 ...

  7. transform方法适配页面大小

    function setCss() {       let App = document.getElementById("app"); // 获取到app节点 最外层的盒子     ...

  8. 【故障公告】龙卷风来袭:突增的并发请求,撑不住的CPU

    (上图是数据库连接数监控图) 非常抱歉,今天下午 16:50-17:40 期间,一场龙卷风突袭园子,突增的并发请求狂卷博客站点的 pod,由于风力巨大(70%左右的增量),pod 的 cpu 不堪重负 ...

  9. jq全选、全不选、反选、单删、批量删除

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  10. MySQL主从复制介绍:使用场景、原理和实践

    MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借 ...