Linux Bash 中使用重定向运算符的 5 种方法

news2025/2/24 21:04:10

注:机翻,未校。


Five ways to use redirect operators in Bash

Posted: January 22, 2021 | by Damon Garn

Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output to make your Linux sysadmin life easier.

重定向操作符是在 Bash 命令行中工作的一个基本但重要的部分。了解如何安全地重定向输入和输出,从而简化 Linux 系统管理员的工作。

Detour sign

Photo by Kind and Curious on Unsplash

Data is entered into the computer via stdin (usually the keyboard), and the resulting output goes to stdout (usually the shell). These pathways are called streams. However, it’s possible to alter these input and output locations, causing the computer to get information from somewhere other than stdin or send the results somewhere other than stdout. This functionality is referred to as redirection.
数据通过 stdin(通常是键盘)输入到计算机中,生成的输出进入 stdout(通常是 shell)。这些路径称为流。但是,可能会更改这些输入和输出位置,从而导致计算机从 stdin 以外的位置获取信息,或者将结果发送到 stdout 以外的位置。此功能称为重定向。

In this article, you’ll learn five redirect operators, including one for stderr. I’ve provided examples of each and presented the material in a way that you can duplicate on your own Linux system.
在本文中,您将学习 5 个重定向运算符,包括一个用于 stderr 的运算符。我提供了每个示例,并以您可以在自己的 Linux 系统上复制的方式呈现这些材料。

Regular output > operator 常规输出>运算符

The output redirector is probably the most recognized of the operators. The standard output (stdout) is usually to the terminal window. For example, when you type the date command, the resulting time and date output is displayed on the screen.
输出重定向器可能是运算符中最受认可的。标准输出 (stdout) 通常发送到终端窗口。例如,当您键入 date 命令时,生成的时间和日期输出将显示在屏幕上。

[damon@localhost ~]$ date
Tue Dec 29 04:07:37 PM MST 2020
[damon@localhost ~]$

It is possible, however, to redirect this output from stdout to somewhere else. In this case, I’m going to redirect the results to a file named specifications.txt. I’ll confirm it worked by using the cat command to view the file contents.
但是,可以将此输出从 stdout 重定向到其他位置。在本例中,我要将结果重定向到名为 specifications.txt 的文件。我将通过使用 cat 命令查看文件内容来确认它是否正常工作。

[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ cat specifications.txt 
Tue Dec 29 04:08:44 PM MST 2020
[damon@localhost ~]$ 

The problem with the > redirector is that it overwrites any existing data in the file. At this stage, you now have date information in the specifications.txt file, right? If you type hostname > specifications.txt, the output will be sent to the text file, but it will overwrite the existing time and date information from the earlier steps.
> 重定向器的问题在于它会覆盖文件中的所有现有数据。在此阶段,您现在在 specifications.txt 文件中有 date 信息,对吧?如果键入 hostname > specifications.txt,输出将发送到文本文件,但会覆盖先前步骤中的现有时间和日期信息。

[damon@localhost ~]$ hostname > specifications.txt 
[damon@localhost ~]$ cat specifications.txt 
localhost.localdomain
[damon@localhost ~]$ 

It is easy to get in trouble with the > redirector by accidentally overwriting existing information.
由于意外覆盖现有信息,很容易在使用 > 重定向器时遇到麻烦。

Regular output append >> operator 常规输出追加>>运算符

The append >> operator adds the output to the existing content instead of overwriting it. This allows you to redirect the output from multiple commands to a single file. For example, I could redirect the output of date by using the > operator and then redirect hostname and uname -r to the specifications.txt file by using >> operator.
追加 >> 运算符将输出添加到现有内容中,而不是覆盖它。这使您可以将多个命令的输出重定向到单个文件。例如,我可以使用 > 运算符重定向 date 的输出,然后使用 >> 运算符将 hostnameuname -r 重定向到 specifications.txt 文件。

[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ hostname >> specifications.txt 
[damon@localhost ~]$ uname -r >> specifications.txt 
[damon@localhost ~]$ cat specifications.txt 
Tue Dec 29 04:11:51 PM MST 2020
localhost.localdomain
5.9.16-200.fc33.x86_64
[damon@localhost ~]$ 

Note: The >> redirector even works on an empty file. That means that you could conceivably
注意:>> 重定向器甚至可以处理空文件。

ignore the regular > redirector to alleviate the potential to overwrite data, and always rely on the >> redirector instead. It’s not a bad habit to get into.
忽略常规 > 重定向器以减轻覆盖数据的可能性,并始终依赖 >> 重定向器。养成这不是一个坏习惯。

Regular input < operator 常规输入<运算符

The input redirector pulls data in a stream from a given source. Usually, programs receive their input from the keyboard. However, data can be pulled in from another source, such as a file.
输入重定向器从给定源拉取流中的数据。通常,程序从键盘接收输入。但是,可以从其他源(例如文件)拉取数据。

It’s time to build an example by using the sort command. First, create a text file named mylist.txt that contains the following lines:
现在是使用 sort 命令构建示例的时候了。首先,创建一个名为 mylist.txt 的文本文件,其中包含以下行:

cat
dog
horse
cow

Observe that the animals are not listed in alphabetical order.
请注意,这些动物不是按字母顺序列出的。

What if you need to list them in order? You can pull the contents of the file into the sort command by using the < operator.
如果您需要按顺序列出它们怎么办?您可以使用 < 运算符将文件的内容拉入 sort 命令。

[damon@localhost ~]$ sort < mylist.txt 
cat
cow
dog
horse
[damon@localhost ~]$ 

You could even get a little fancier and redirect the sorted results to a new file:
您甚至可以更花哨一点,并将排序结果重定向到新文件:

[damon@localhost ~]$ sort < mylist.txt > alphabetical-file.txt
[damon@localhost ~]$ cat alphabetical-file.txt 
cat
cow
dog
horse
[damon@localhost ~]$ 

Regular error 2> operator 常规错误 2> 运算符

The stdout displays expected results. If errors appear, they are managed differently. Errors are labeled as file descriptor 2 (standard output is file descriptor 1). When a program or script does not generate the expected results, it throws an error. The error is usually sent to the stdout, but it can be redirected elsewhere. The stderr operator is 2> (for file descriptor 2).
stdout 显示预期结果。如果出现错误,将以不同的方式进行管理。错误被标记为文件描述符 2(标准输出为文件描述符 1)。当程序或脚本未生成预期结果时,它会引发错误。错误通常会发送到 stdout,但可以将其重定向到其他地方。stderr 运算符为 2>(用于文件描述符 2)。

Here is a simple example, using the misspelled ping command:
下面是一个简单的示例,使用拼写错误的 ping 命令:

[damon@localhost ~]$ png
bash: png: command not found...
[damon@localhost ~]$

Here is the same misspelled command with the error output redirected to /dev/null:
这是相同的拼写错误命令,错误输出重定向到 /dev/null

[damon@localhost ~]$ png 2> /dev/null
[damon@localhost ~]$ 

Skip to the bottom of list
Automation advice 自动化建议
Ansible Automation Platform beginner’s guide Ansible 自动化平台初学者指南
A system administrator’s guide to IT automation IT 自动化系统管理员指南
Ansible Automation Platform trial subscription Ansible 自动化平台试用订阅
Automate Red Hat Enterprise Linux with Ansible and Satellite 使用 Ansible 和 Satellite 实现红帽企业 Linux 的自动化

The resulting error message is redirected to /dev/null instead of the stdout, so no result or error message is displayed on the screen.
生成的错误消息将重定向到 /dev/null 而不是 stdout,因此屏幕上不会显示任何结果或错误消息。

Note: /dev/null, or the bit bucket, is used as a garbage can for the command line. Unwanted output can be redirected to this location to simply make it disappear. For example, perhaps you’re writing a script, and you want to test some of its functionality, but you know it will throw errors that you don’t care about at this stage of development. You can run the script and tell it to redirect errors to /dev/null for convenience.
注意:/dev/null,即位桶,用作命令行的垃圾桶。不需要的输出可以重定向到此位置,以使其消失。例如,也许您正在编写一个脚本,并且想要测试其中的一些功能,但您知道它会抛出您在此开发阶段不关心的错误。为方便起见,您可以运行脚本并告诉它将错误重定向到 /dev/null

Pipe | operator 管道 | 运算符

Ken Hess already has a solid article on using the pipe | operator, so I’m only going to show a very quick demonstration here.
Ken Hess 已经有一篇关于使用 pipe | 运算符的扎实文章,所以我在这里只打算展示一个非常快速的演示。

The pipe takes the output of the first command and makes it the input of the second command. You might want to see a list of all directories and files in the /etc directory. You know that’s going to be a long list and that most of the output will scroll off the top of the screen. The less command will break the output into pages, and you can then scroll upward or downward through the pages to display the results. The syntax is to issue the ls command to list the contents of /etc, and then use pipe to send that list into less so that it can be broken into pages.
管道接收第一个命令的输出,并使其成为第二个命令的输入。您可能希望查看 /etc 目录中所有目录和文件的列表。你知道这将是一个很长的列表,大部分输出将从屏幕顶部滚动。less 命令会将输出分解为多个页面,然后您可以向上或向下滚动页面以显示结果。语法是发出 ls 命令列出 /etc 的内容,然后使用管道将该列表发送到 less 中,以便可以将其分解为多个页面。

[damon@localhost ~]$ ls /etc | less

Ken’s article has many more great examples. Personally, I find myself using *command* | less and *command* | grep *string* the most often.
Ken 的文章还有很多很好的例子。就我个人而言,我发现自己最常使用 *command* | less*command* | grep *string*

Download now: A sysadmin’s guide to Bash scripting.

Wrap up 总结

Redirect operators are very handy, and I hope this brief summary has provided you with some tricks for manipulating input and output. The key is to remember that the > operator will overwrite existing data.
重定向运算符非常方便,我希望这个简短的摘要为您提供了一些操作输入和输出的技巧。关键是要记住 > 运算符将覆盖现有数据。


Bash Redirections Cheat Sheet

RedirectionDescription
cmd > fileRedirect the standard output (stdout) of cmd to a file.
cmd 1> fileSame as cmd > file. 1 is the default file descriptor (fd) for stdout.
cmd 2> fileRedirect the standard error (stderr) of cmd to a file. 2 is the default fd for stderr.
cmd >> fileAppend stdout of cmd to a file.
cmd 2>> fileAppend stderr of cmd to a file.
cmd &> fileRedirect stdout and stderr of cmd to a file.
cmd > file 2>&1Another way to redirect both stdout and stderr of cmd to a file. This is not the same as cmd 2>&1 > file. Redirection order matters!
cmd > /dev/nullDiscard stdout of cmd.
cmd 2> /dev/nullDiscard stderr of cmd.
cmd &> /dev/nullDiscard stdout and stderr of cmd.
cmd < fileRedirect the contents of the file to the standard input (stdin) of cmd.
cmd << EOL
line1
line2
EOL
Redirect a bunch of lines to the stdin. If ‘EOL’ is quoted, text is treated literally. This is called a here-document.
cmd <<-EOL
<tab>foo
<tab><tab>bar
EOL
Redirect a bunch of lines to the stdin and strip the leading tabs.
cmd <<< “string”Redirect a single line of text to the stdin of cmd. This is called a here-string.
exec 2> fileRedirect stderr of all commands to a file forever.
exec 3< fileOpen a file for reading using a custom file descriptor.
exec 3> fileOpen a file for writing using a custom file descriptor.
exec 3< > fileOpen a file for reading and writing using a custom file descriptor.
exec 3>&-Close a file descriptor.
exec 4>&3Make file descriptor 4 to be a copy of file descriptor 3. (Copy fd 3 to 4.)
exec 4>&3-Copy file descriptor 3 to 4 and close file descriptor 3.
echo “foo” >&3Write to a custom file descriptor.
cat <&3Read from a custom file descriptor.
(cmd1; cmd2) > fileRedirect stdout from multiple commands to a file (using a sub-shell).
{ cmd1; cmd2; } > fileRedirect stdout from multiple commands to a file (faster; not using a sub-shell).
exec 3< > /dev/tcp/host/portOpen a TCP connection to host:port. (This is a bash feature, not Linux feature).
exec 3< > /dev/udp/host/portOpen a UDP connection to host:port. (This is a bash feature, not Linux feature).
cmd <(cmd1)Redirect stdout of cmd1 to an anonymous fifo, then pass the fifo to cmd as an argument. Useful when cmd doesn’t read from stdin directly.
cmd < <(cmd1)Redirect stdout of cmd1 to an anonymous fifo, then redirect the fifo to stdin of cmd. Best example: diff <(find /path1 | sort) <(find /path2 | sort).
cmd <(cmd1) <(cmd2)Redirect stdout of cmd1 and cmd2 to two anonymous fifos, then pass both fifos as arguments to cmd.
cmd1 >(cmd2)Run cmd2 with its stdin connected to an anonymous fifo, and pass the filename of the pipe as an argument to cmd1.
cmd1 > >(cmd2)Run cmd2 with its stdin connected to an anonymous fifo, then redirect stdout of cmd to this anonymous pipe.
cmd1 | cmd2Redirect stdout of cmd1 to stdin of cmd2. Pro-tip: This is the same as cmd1 > >(cmd2), same as cmd2 < <(cmd1), same as > >(cmd2) cmd1, same as < <(cmd1) cmd2.
cmd1 |& cmd2Redirect stdout and stderr of cmd1 to stdin of cmd2 (bash 4.0+ only). Use cmd1 2>&1 | cmd2 for older bashes.
cmd | tee fileRedirect stdout of cmd to a file and print it to screen.
exec {filew}> fileOpen a file for writing using a named file descriptor called {filew} (bash 4.1+).
cmd 3>&1 1>&2 2>&3Swap stdout and stderr of cmd.
cmd > >(cmd1) 2> >(cmd2)Send stdout of cmd to cmd1 and stderr of cmd to cmd2.
cmd1 | cmd2 | cmd3 | cmd4 echo ${PIPESTATUS[@]}Find out the exit codes of all piped commands.

via:

  • Five ways to use redirect operators in Bash | Enable Sysadmin Posted: January 22, 2021 | by Damon Garn
    https://www.redhat.com/sysadmin/redirect-operators-bash

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

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

相关文章

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…

‘list‘ object has no attribute ‘mul‘

原来运行得好好的&#xff0c;突然出现错误&#xff1a;list object has no attribute mul &#xff0c;更换一个输入路径&#xff0c;又没问题&#xff0c;改一个路径&#xff0c;还是出现错误&#xff0c;很奇怪&#xff0c;后来又没有问题&#xff0c;记录一下。 参考这文…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的旅行社在线预订与行程管理系统

开题报告 本文旨在设计研究与开发一个旅行社在线预订与行程管理系统。首先&#xff0c;本文介绍了旅行社在线预订与行程管理系统相关技术集成开发环境、软硬件环境&#xff0c;SpringBoot框架、Vue.js框架的基本原理和优势&#xff0c;以及在旅行社在线预订与行程管理系统开发…

HarmonyOS快速入门

HarmonyOS快速入门 1、基本概念 UI框架&#xff1a; HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用&#xff0c;可能需要进行项目切换管理&#xff0c;所以这里创建一个项目管理页面&#xff0c;登录成功后跳转这个页面&#xff0c;进行选择项目&#xff0c;再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境&#xff1a;CANoe、待测设备&#xff08;包含UDS诊断模块&#xff09; 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

C++ 类- 构造和析构

空类 class A {};空类大小&#xff1a; sizeof(A) 1编译器会默认生成 6 个成员函数&#xff1a; class A { public:A();//构造函数 - 完成对象初始化工作~A();//析构函数 - 完成对象的资源清理A(const A& a);//拷贝构造函数 - 使用同一类中之前创建的对象来初始化新创建…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…

包文件分析器 Webpack Bundle Analyzer

webpack-bundle-analyzer 是一个非常有用的工具&#xff0c;用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小&#xff0c;以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍&#xff0c;包括它的安装、使用以…

【深度解析Java 20天速成】04_IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种措施确保受访者的代表性&#xff0c;但结果可能会略微偏向 JetBrains 产品的用户&#xff0c;因为这些用户更有可能参加调查。 此外&#xff0c;2022年&#xff0c;某美国软件开发商在对近千名专业的Ja…

算法竞赛之差分进阶——等差数列差分 python

目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]&#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很简单&#xff0c;差分一下即可 还不会的小伙伴点此进入学习 进入正题 …

【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…

小程序 -- uni-app开发微信小程序环境搭建(HBuilder X+微信开发者工具)

目录 前言 一 软件部分 1. 微信开发者工具 2. HBuilder X 开发工具 二 配置部分 1. 关于 HBuilder X 配置 2. 关于 微信开发工具 配置 三 运行项目 1. 新建项目 2. 代码编写 3. 内置浏览器 编译 4. 配置小程序 AppID获取 注意 四 实现效果 前言 uni-app开发小程…