Pipelines in Shell

news2025/7/14 22:55:30

本篇文章内容需要读者知道 shell 的一些语法和作用,知道 shell 的用途,和一些基本的用法。

这里可以查看原文:Pipelines in Shell

学习 shell 脚本必须要理解 pipeline 的概念,知道 command 的输入(input)和输出(output)的概念。只有掌握了 pipeline 的机制我们才能更好的写好 shell 脚本,本章内容详细介绍 pipeline。

shell 中的 command 可以接受一些输入然后产生一些输出,类似与数学中的函数表达式 y = f(x),输入参数 x,得到结果 y,command 就可以看作是一个函数方程。

标准输入、输出和错误

stdin、stdout、stderr

每一个程序都会接触到三个比较特殊的文件(linux 中所有东西都是文件):stdinstdoutstderr

  • stdin:standard input 的缩写,意思是标准输入,大部分程序从这里读取输入,用数字 0 表示
  • stdout:standard output 的缩写,意思是标准输出,大部分程序将输出信息写入到这个文件里,用数字 1 表示
  • stderr:standard error 的缩写,意思是标准错误,大部分程序出错了需要将错误信息写入这个文件,用数字 2 表示

上面用了 大部分 这个修饰词,意思并不是所有的程序都会按照上面的规范去读取和输出信息,因为任何程序都可以自由选择从哪里读取输入,将输出信息写入哪里。

这三个特殊的文件存储在 dev/ (dev 表示 device)文件夹下:

$ ls -al /dev/std*
lrwxrwxrwx 1 root root 15 Nov 26 20:25 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Nov 26 20:25 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Nov 26 20:25 /dev/stdout -> /proc/self/fd/1

每次在 shell 中运行一个程序,shell 会将键盘与程序的标准输入关联在一起,并将标准输出和标准错误与终端显示连接在一起:

stdin、stdout、stderr

从上图中我们可以看到数据的流转,键盘 -> stdin 文件 -> program -> stdout/stderr -> 屏幕,这里的数据流转本质上也是 pipeline。

pipe(|)操作符

可以通过 | 操作符将一个命令的输出重定向到另一个命令的输入,即将一个命令的 stdout 作为 另一个命令的 stdin。动手实践一下:

# 查看 file.txt 文件内容
$ cat file.txt
File
Edit
Selection
view
go
Run
Terminal
help
go
view

# 将文件中的内容排序并且去重
$ cat file.txt | sort | uniq
Edit
File
Run
Selection
Terminal
go
help
view

重新用途表示 cat test.txt | sort | uniq 的数据流转:

stdin、stdout、stderr

输入重定向 <

< 可以将一个程序的标准输入重定向至某个文件,例如 rev < /dev/stdin,即 rev 命令将从标准输入读取输入,所以 rev < /dev/stdin回车 与 rev 直接回车命令是等价的。

输出重定向至文件 >>>

  • > 将一个命令的输出写入一个文件,并覆盖(override)文件内容
  • >> 将一个命令的输出内容添加(append)至文件的尾部,不删除文件原有的内容
$ echo "Hello Shell" > test.txt
$ cat test.txt
Hello Shell
$ echo "Hello Pipeline" >> test.txt
$ cat test.txt
Hello Shell
Hello Pipeline

2>2>> 表示将标准错误重定向至某个文件,2 是标准错误的文件描述符

标准错误

我们试着在同一个路径下创建两个相同的目录,看看会发生什么:

$ mkdir js
$ mkdir js
mkdir: cannot create directory ‘js’: File exists

可以看到再次创建同名目录,shell 会报错,这里的错误信息就是标准错误,不是标准输出。我们可以试试使用 pipe 操作符,看能否重定向标准错误。

测试需要使用 tr(translate characters)命令,可以将字符小写转换为大写,例如:

$ echo 'Be quiet, this is a library!' | tr '[:lower:]' '[:upper:]'
BE QUIET, THIS IS A LIBRARY!

现在我们重定向我们的错误信息:

$ mkdir js | tr '[:lower:]' '[:upper:]'
mkdir: cannot create directory ‘js’: File exists

可以看到 tr 命令似乎并没有接收到任何标准输入,这是因为 mkdir js 出错了,错误信息输出到了标准错误,而 | 只会重定向标准输出。

在上面提到过 stdinstdoutstderr 都有一个文件描述符分别为 012

那如何处理标准错误信息呢?这里有一些常规的做法:

stdin、stdout、stderr

  • 2>&12> 用于标准错误重定向到某个文件,而 stdinstdoutstderr 是特殊的文件,所以这里表示标准错误(2)重定向到标准输出(1)
  • 2>./errors.txt:将标准错误信息重定向到某个文件,会覆盖文件原有内容
  • 2>/dev/null: 将标准错误输出到 /dev/null
  • 2>>./errors.txt: 将标准错误信息添加到某个文件
  • >output.txt 2>&1:将标准错误和标准输出都重定向到 output.txt 文件

我们试着将创建文件夹的报错信息重定向到 error.txt 文件:

$ mkdir js 2>error.txt
$ cat error.txt
mkdir: cannot create directory ‘js’: File exists

2>error.txt 表示重定向错误信息,所以第一次执行 mkdir js 时屏幕上并没有报错信息。

参考

推荐一本非常棒的 shell 学习教程:Effective Shell。

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译概念总结

一个很笨很笨的人的编译自救笔记。 1 程序设计语言 程序设计语言用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中&#xff0c;这些记号串就是程序。 程序设计语言由三个方面的因素&#xff0c;语法…

[附源码]SSM计算机毕业设计商场日常维修管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度学习(19):nerf论文公式理解

注&#xff1a;有问题欢迎评论留言&#xff0c;但尽量不要喷呀。 1. nerf论文第四章翻译如下&#xff1a; 我们的5D神经辐射场将场景表示为空间任意点的体积密度和定向发射辐射&#xff08;directional emitted radiance&#xff09;。我们使用经典体积渲染&#xff08;class…

嗯哦哎辟 2022 游寄

虽然上次不是假的&#xff0c;但这次是真的寄了。 Day 0 虽然是南京本地人&#xff0c;但因疫情原因&#xff0c;晚上决定去住了酒店。 看了一眼考场&#xff0c;感觉位置小得离谱。不愧是 NOI 2022 团体总分第十的“强省”江苏。 刚开始去了 409&#xff0c;发现房间里一股…

C++ 基础入门

1、变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内存。 2、常量 作用&#xff1a;用于记录程序中不可更改的数据 C中定义常量的两种方式&#xff1a; #define 宏常量&#xff1a; #define 常量名 常量值const修饰的变量&#xff1a;const数据类型 …

26k Star, 理解Git太轻松了。。。

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store Git是目前使用比较广泛一款版本控制工具&#xff0c;从事开发工作&#xff0c;很难绕开Git。 因此&#xff0c;关于如何快速学习Git使用一直都是一个经久不衰的话题。 前不久我在另外一篇文章中曾提到Git对初…

【药材识别】基于色差色温特征结合SVM实现药材炮制程度判断系统附GUI界面

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

十九种卷积

参考文章:一文看尽深度学习中的20种卷积(附源码整理和论文解读) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/381839221 一、原始卷积(Vanilla Convolution) CNNs中的卷积,也称为滤波器,是由一组具有固定窗口大小且带可学习参数(learnable paramerters)的卷积核所组…

Java之IO流详解(一)——File类

一、File类创建文件 方法说明public boolean createNewFile()当具有该名称的文件不存在时&#xff0c;创建一个由该抽象路径命名的新空文件public boolean mkdir()创建由此抽象路径命名的目录public boolean mkdirs()创建由此抽象路径命名的目录&#xff0c;包括任何必须但不存…

Go常见错误第15篇:interface使用的常见错误和最佳实践

前言 这是Go常见错误系列的第15篇&#xff1a;interface使用的常见错误和最佳实践。 素材来源于Go布道者&#xff0c;现Docker公司资深工程师Teiva Harsanyi。 本文涉及的源代码全部开源在&#xff1a;Go常见错误源代码&#xff0c;欢迎大家关注公众号&#xff0c;及时获取本…

加载配置文件内容利用反射动态创建对象和调用方法(开闭原则的体现)

反射的应用&#xff1a;根据配置文件来创建对象和调用方法 需求&#xff1a;1&#xff0c;根据配置文件re.properties 指定的信息&#xff0c;创建对象并调用方法 classfullpathsrc.com.liu.Cat methodhi 即通过外部文件配置&#xff0c;在不修改源码的情况下&#xff0c;来控…

GAN详解

前言 GAN是当今作为火热的生成式算法&#xff0c;由Ian Goodfellow&#xff0c;Yoshua Bengio等人在2014年提出的&#xff0c;Yan LeCun表示道GAN是“adversarial training is the coolest thing since sliced bread”。它使用两个神经网络&#xff0c;将一个神经网络与另一个…

ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法

本文介绍在ArcMap软件中&#xff0c;将栅格图层中的0值或其他指定数值作为NoData值的方法。 在处理栅格图像时&#xff0c;有时会发现如下图所示的情况——我们对某一个区域的栅格数据进行分类着色后&#xff0c;其周边区域&#xff08;即下图中浅蓝色的区域&#xff09;原本应…

C语言学习记录(十五)C预处理器和C库

文章目录一、C预处理器1.1 翻译程序1.2 明示常量&#xff1a;#define1.3 在#define中使用参数1.4 文件包含&#xff1a;#include1.5 其他指令1.5.1 #undef指令1.5.2 从C预处理角度看已定义1.5.3 条件编译1.5.3.1 #ifdef、#else和#endif指令1.5.3.2 #ifndef1.5.3.3 #if和elif指令…

Gof23-创建型-工厂-单例-抽象工厂-建造-原型以及UML的绘制

创建型的设计模式工厂模式单例模式抽象工厂建造者模式原型模式UML图形的绘制工厂模式 工厂模式 Factory Pattern 适用的场景&#xff1a;统一的接口作为统一的零件&#xff0c;实现类作为零件的组合&#xff0c;将实例产品类的生产交给工厂&#xff0c;用户只需要面对工程提取…

XML的创建和读取

rapidxml是一个快速的xml库&#xff0c;由C模板实现的高效率xml解析库&#xff0c;同时也是boost库的property_tree的内置解析库。 当使用rapidxml时&#xff0c;只需要把rapidxml.hpp 、 rapidxml_print.hpp 和 rapidxml_utils.hpp 三个文件拷贝到你的工程目录下&#xff0c;就…

Pytorch中KL loss

1. 概念 KL散度可以用来衡量两个概率分布之间的相似性&#xff0c;两个概率分布越相近&#xff0c;KL散度越小。 上述公式表示P为真实事件的概率分布&#xff0c;Q为理论拟合出来的该事件的概率分布。D(P||Q)&#xff08;P拟合Q&#xff09;和D(Q||P)&#xff08;Q拟合P&…

ajax之Content-Type示例

参考资料: Content-Type详解【SpringBoot】SpringBoot接收请求的n种姿势 目录前期准备0. Content-Type概念解释1. application/x-www-form-urlencoded1.1 form表单示例1.2 jQuery的ajax示例2. application/json2.1 指定contentType为json,不使用RequestBody接收2.2 不指定cont…

01 OSI七层网络排查 troubleshooting 思路及对应工具

文章目录1 .前言2. OSI 的七层模型&#xff0c;和 TCP/IP 的四层 / 五层模型区别2.1 网络专业术语2.2 TLS 解释2.3 什么是TCP 流&#xff1f;3. 网络各层排查工具3.1 应用层3.1.1 浏览器的开发者工具3.1.1.1 找到有问题的服务端IP3.1.1.2 辅助排查网页慢的问题3.1.1.3 解决失效…

嵌入式数据库sqlite3

一、数据库 数据库的基本概念 常用的数据库 大型数据库 Oracle公司是最早开发关系数据库的厂商之一&#xff0c;其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。 IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统&#xff0c;支…