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

SHELL脚本学习(六) 呈现数据

一、标准文件描述符

linux系统会将每个对象当作文件来处理,包括输入和输出。linux用文件描述符来描述每个对象。文件描述符是一个非负整数,唯一会标识的是打开的文件。每个进程一次最多能打开9个文件描述符。处于特殊目的,bash shell保留了前三个文件描述符(0,1,2)。

文件描述符缩写描述
0STDIN标准输入
1STDOUT标准输出
2STDERR标准错误
1.1 STDIN

STDIN文件描述符代表shell的标准输入。对于终端界面来说标准输入就是键盘。shell会从STDIN对应的键盘获取数据并处理。
使用输入重定向时,linux会用重定向指定的文件替换标准输入文件描述符。
许多bash命令可以从STDIN接收数据,例如cat

~$ cat 
first line
first line
second line
second line

也可以使用输入重定向强制cat接收来自STDIN之外的文件的数据。

$ cat < test.sh
#!/usr/bin/bash
cat ./test.sh| while read line
doecho $line
done 
1.2 STDOUT

STDOUT文件描述符代表shell的标准输出。在终端界面上标准输出就是显示器。在默认情况下大多数bash命令会将输出送往STDOUT文件描述符。可以使用输出重定向更改此设置。

$ ls -l >file1
$ cat < file1
total 48
...
-rw-rw-r-- 1 ubuntu ubuntu     0 Jun 12 18:03 file1
-rw-rw-r-- 1 ubuntu ubuntu    11 May 24 15:49 file2
...

也可以使用 >> 将数据追加到某个文件。

但是对脚本使用标准输出重定向,就会遇到一个问题,看看下面的例子:

$ ls -al nofile >file3
ls: cannot access 'nofile': No such file or directory
$ cat < file3
$ 

shell创建了输出重定向,但错误信息依然显示在屏幕上。
shell对于错误信息的处理跟普通输出是分开的。如果想让错误信息输出到文件,需要重定向错误。

1.3 STDERR

shell通过特殊的STDERR文件描述符处理错误信息。STDERR文件描述代表shell的标准错误输出。shell运行或者运行在shell的程序和脚本出错时,生成的错误信息都会送往这个位置。在默认情况下STDOUT和STDERR指向同一个地方,也就是显示器。

1.3.1 只重定向错误

STDERR文件描述符为2,可以将文件描述符值放在重定向符号前,只重定向错误信息。

$ ls -l nofile 2> file3
$ cat < file3
ls: cannot access 'nofile': No such file or directory
1.3.2 重定向错误信息和正常输出

如果想重定向错误和输出信息,必须使用两个重定向符号

$ ls -al file1 nofile 1> file2 2>file3
$ cat <file2
--w--w---- 1 ubuntu ubuntu 0 Jun 12 18:23 file1
$ cat <file3
ls: cannot access 'nofile': No such file or directory

可以使用这种方式区分脚本的正常输出和错误信息。

也可以将STDERR和STDOUT重定向到一个文件,bash shell提供了特殊的重定向符号 &>

$ ls -al file1 nofile &> file2
$ cat < file2
ls: cannot access 'nofile': No such file or directory
--w--w---- 1 ubuntu ubuntu 0 Jun 12 18:23 file1

二、在脚本中重定向输出

2.1 临时重定向

如果你有意在脚本中生成一条错误信息。可以将一行单独的信息重定向到STDERR。这只需要使用输出重定向符号将输出重定向到STDERR文件描述符。在重定向到文件描述符时,必须在文件描述符值前面加一个 &

#!/usr/bin/bash
# test.sh
echo "this a error 1" >&2
echo "this a error 2" >&2
echo "this a error 3" >&2
echo "this is a normal output 1"
echo "this is a normal output 2"
echo "this is a normal output 3"$ ./test.sh > file2 2> file3
$ cat <file2
this is a normal output 1
this is a normal output 2
this is a normal output 3
$ cat <file3
this a error 1
this a error 2
this a error 3
2.2 永久重定向

如果脚本中有大量数据需要重定向,那么逐条重定向echo语句会很麻烦。这时可以使用exec命令,它告诉shell在脚本执行期间重定向某个特定文件描述符:

#!/usr/bin/bash
exec 1>fileout
echo "this is a normal output 1"
echo "this is a normal output 2"
echo "this is a normal output 3"$ ./test.sh
$ cat <fileout
this is a normal output 1
this is a normal output 2
this is a normal output 3

三、在脚本中重定向输入

与重定向STDERR和STDOUT相似,可以将STDIN从键盘重定向到指定位置。linux系统中,exec命令可以将STDIN重定向到文件:

#!/usr/bin/bash
exec 0<test.shwhile read opt
doecho $opt    
done$ ./test.sh
#!/usr/bin/bash
exec 0<test.shwhile read opt
do
echo $opt
done

read命令读取用户输入的数据,将STDIN重定向为文件后,当read试图从STDIN读取数据时,就会到文件中检索数据。

四、创建自己的重定向

重定向输入输出时,并不局限于默认的3个文件描述符。文件描述符3到8均可以用作输入和输出的重定向。

4.1 创建输出文件描述符

可以用exec命令分配用于输出的文件描述符。

#!/usr/bin/bash
exec 3>fileoutecho "this should store in the file" >&3
echo "this is a normal output"$ ./test.sh
this is a normal output
$ cat <fileout
this should store in the file
4.2 重定向文件描述符

有一种方法可以恢复已重定向的文件描述符。可以先将STDOUT的位置重定向到一个文件描述符,之后再用这个文件描述符恢复STDOUT

#!/usr/bin/bash
exec 3>&1    
exec >fileout
echo "store in the fileout 1"
echo "store in the fileout 2"
echo "store in the fileout 3"
exec 1>&3
echo "normal output 1"
echo "normal output 2"
echo "normal output 3"$ ./test.sh
normal output 1
normal output 2
normal output 3
$ cat < fileout
store in the fileout 1
store in the fileout 2
store in the fileout 3
4.3 创建输入文件描述符

可以采用和重定向输出同样的方法重定向输入文件描述符。在重定向之前先将STDIN的位置保存到另一个文件描述符,之后再用这个文件描述符恢复STDIN。

#!/usr/bin/bash
#test.sh
exec 3<&0
exec 0<test.shcount=1
while read opt
doecho $count  $optcount=$[ $count+1 ]
doneexec 0<&3#在bash中执行脚本$ ./test.sh
1 #!/usr/bin/bash
2 exec 3<&0
3 exec 0<test.sh
4
5 count=1
6 while read opt
7 do
8 echo $count $opt
9 count=$[ $count+1 ]
10 done
11
12 exec 0<&3
4.4 关闭文件描述符

关闭文件描述符,只需要将文件描述符重定向到 &- 即可。
例: exec 3>&-

五、抑制命令输出

要抑制命令输出,只需将输出重定向到 /dev/null

六、将消息同时送往显示器和文件

有时需要将消息同时发送到文件和显示器,与其使用两次重定向,不如使用特殊命令tee。

tee filename
tee命令:将STDIN的数据同时送往两处。一处是显示器,一处是filename指定的文件。
如果要将数据追加到文件,使用 -a选项。

$ date | tee fileout
Wed 12 Jun 2024 08:09:41 PM CST
ubuntu@VM-8-14-ubuntu:~$ cat <fileout
Wed 12 Jun 2024 08:09:41 PM CST

相关文章:

SHELL脚本学习(六) 呈现数据

一、标准文件描述符 linux系统会将每个对象当作文件来处理&#xff0c;包括输入和输出。linux用文件描述符来描述每个对象。文件描述符是一个非负整数&#xff0c;唯一会标识的是打开的文件。每个进程一次最多能打开9个文件描述符。处于特殊目的&#xff0c;bash shell保留了前…...

计算机网络:网络层 - IPv4数据报 ICMP协议

计算机网络&#xff1a;网络层 - IPv4数据报 & ICMP协议 IPv4数据报[版本 : 首部长度 : 区分服务 : 总长度][标识 : 标志 : 片偏移][生存时间 : 协议 : 首部检验和][可变部分 : 填充字段] ICMP协议 IPv4数据报 一个IPv4数据报&#xff0c;由首部和数据两部分组成&#xff…...

【需求设计】软件概要设计说明怎么写?概要设计说明书实际项目案例(63页Word直接套用)

软件概要设计说明书书写要点可以归纳为以下几个方面&#xff0c;以确保文档的准确性、完整性和可读性&#xff1a; 引言 目的&#xff1a;介绍编写该文档的目的、主要内容及目标读者。 背景&#xff1a;说明被开发软件的名称、项目提出者、开发者等背景信息。 需求概述&#xf…...

网络编程2----UDP简单客户端服务器的实现

首先我们要知道传输层提供的协议主要有两种&#xff0c;TCP协议和UDP协议&#xff0c;先来介绍一下它们的区别&#xff1a; 1、TCP是面向连接的&#xff0c;UDP是无连接的。 连接的本质是双方分别保存了对方的关键信息&#xff0c;而面向连接并不意味着数据一定能正常传输到对…...

服务架构的设计原则

墨菲定律与康威定律 在系统设计的时候&#xff0c;可以依据于墨菲定律 任何事情都没有表面上看起来那么简单所有的事情都会比你预计的时间长可能出错的事总会出错担心的某一个事情的发送&#xff0c;那么它就更有可能发生 在系统划分的时候&#xff0c;可以依据康威定律 系…...

Day 14:2938. 区分黑球和白球

Leetcode 2938. 区分黑球和白球 桌子上有 n 个球&#xff0c;每个球的颜色不是黑色&#xff0c;就是白色。 给你一个长度为 n 、下标从 0 开始的二进制字符串 s&#xff0c;其中 1 和 0 分别代表黑色和白色的球。 在每一步中&#xff0c;你可以选择两个相邻的球并交换它们。 返…...

部署YUM仓库及NFS共享服务

YUM概述 YUM 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 YUM只允许一个程序运行&#xff0c;虽然不影响命令的使用。DNF后&#xff0c;允许多个程序允许 YUM的配置文件在/etc/yum.conf 网络源&#xff08;所有以repo为结尾都是源&am…...

web学习笔记(六十五)

目录 1. Hash模式和History模式 2. 导航守卫 3. 路由元信息 4.路由懒加载 1. Hash模式和History模式 Hash模式&#xff08;哈希模式&#xff09;和History模式&#xff08;历史模式&#xff09;是匹配路由的两种模式&#xff0c;一般默认配置Hash模式&#xff0c;可以在in…...

66. UE5 RPG 实现远程攻击武器配合角色攻击动画

在制作游戏中&#xff0c;我们制作远程攻击角色&#xff0c;他们一般会使用弓箭&#xff0c;弩&#xff0c;弹弓等武器来进行攻击。比如你使用弓箭时&#xff0c;如果角色在播放拉弓弦的动画&#xff0c;但是弓箭武器没有对应的表现&#xff0c;会显得很突兀。所以&#xff0c;…...

用 Python 编写自动发送每日电子邮件报告的脚本,并指导我如何进行设置

编写一个自动发送每日电子邮件报告的脚本涉及几个步骤。我们需要使用 Python 编写脚本&#xff0c;并使用一些库来发送电子邮件。下面是一个示例脚本和设置步骤。 第一步&#xff1a;安装必要的库 我们需要安装 smtplib 和 email 库。可以通过以下命令安装&#xff1a; pip …...

AI大模型的战场:通用与垂直的较量

目录 AI大模型的战场&#xff1a;通用与垂直的较量 1.引言 2.通用大模型的优势 2.1 概念 2.2 谷歌的BERT模型 2.3 OpenAI的GPT模型 2.4 微软的Visual Studio Code 2.5 结论 3.垂直大模型的崛起 3.1 概念 3.2 医疗影像分析的AI模型 3.3 自动驾驶领域的AI模型 3.4 金…...

单目标应用:基于人工原生动物优化器APO的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、人工原生动物优化算法求解微电网 2.1算法简介 人工原生动物优化器&am…...

USB端口管控软件|USB端口控制软件有哪些(小技巧)

​USB端口管控软件成为了保障企业数据安全的重要手段。 本文将为您介绍几款知名的USB端口控制软件&#xff0c;并分享一些实用的小技巧&#xff0c;帮助您更好地管理US端口&#xff0c;确保企业信息安全。#usb接口# 一、USB端口控制软件推荐 1&#xff0c;域智盾 域智盾是一…...

CorelDRAW2024官方最新中文破解版Crack安装包网盘下载安装方法

在设计的世界里&#xff0c;软件工具的更新与升级总是令人瞩目的焦点。近期&#xff0c;CorelDRAW 2024中文版及其终身永久版的发布&#xff0c;以及中文破解版Crack的出现&#xff0c;再次掀起了设计圈的热潮。对于追求专业精确的设计师而言&#xff0c;了解这些版本的下载安装…...

Mysql学习(八)——多表查询

文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;…...

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中&#xff0c;对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具&#xff0c;能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…...

纷享销客安全体系:安全合规认证

安全合规认证是指组织通过独立的第三方机构对其信息系统和数据进行评估和审查&#xff0c;以确认其符合相关的安全标准、法律法规和行业要求的过程。 安全合规认证可以帮助组织提高信息系统和数据的安全性&#xff0c;并向客户、合作伙伴和监管机构证明其符合相关的安全标准和…...

推荐这两款AI工具,真的很好用

巨日禄 巨日禄是一款由杭州巨日禄科技有限公司开发的AI工具&#xff0c;主要功能是将文本内容转换为视频。该工具通过分析大量的剧本数据和影视作品&#xff0c;为用户提供各种类型的故事情节和角色设置&#xff0c;帮助用户快速找到灵感&#xff0c;减少构思剧本的困难和犹豫。…...

装饰器在实际开发中的作用

首先先说说装饰器的整体优点。 使用装饰器可以实现代码的模块化、可重用性。当需要对多个函数进行相同的功能增强时&#xff0c;通过装饰器可以避免重复代码的编写&#xff0c;提高开发效率。 1、权限检查&#xff1a;通过装饰器可以在函数执行之前检查用户权限&#xff0c;决…...

JVM学习-监控工具(三)

jconsole 从Java5开始&#xff0c;在JDK中自带的java监控和管理控制台用于对JVM中内存、线程、和类等的监控&#xff0c;是一个基本JMX(java management extendsions)的GUI性能监控工具 三种连接方式 Local&#xff1a;使用JConsole连接是一个正在本地系统运行的JVM&#xf…...

从Buck到三电平:软开关DC-DC变换器的Simulink建模与双闭环控制仿真

1. 从Buck到三电平&#xff1a;电力电子技术的进化之路 记得我第一次接触DC-DC变换器时&#xff0c;Buck电路就像是一道必须跨过的门槛。这个经典的降压电路结构简单&#xff0c;却蕴含着电力电子最基础的设计思想。但随着项目需求的提升&#xff0c;传统Buck电路在高压大功率场…...

SEO_避开这些常见SEO误区,你的排名才能快速上升

<h2>SEO误区&#xff1a;为什么你的网站排名不上升</h2> <p>在当前竞争激烈的互联网环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站排名的关键。很多人在进行SEO优化时却常常犯下一些常见的SEO误区。这些误区不仅会让你的排名停滞不前…...

Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原

Phi-4-Reasoning-Vision惊艳案例&#xff1a;模糊图像增强后多步逻辑推理还原 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡4090环境优化。这款工具能够处理复杂的图像推理任务&#xff0c…...

Qwen2.5-Coder-1.5B代码修复实战:常见Bug自动诊断与修复

Qwen2.5-Coder-1.5B代码修复实战&#xff1a;常见Bug自动诊断与修复 你有没有过这样的经历&#xff1f;深夜赶项目&#xff0c;代码跑起来一堆红字&#xff0c;对着报错信息一头雾水&#xff0c;查了半天文档还是找不到问题在哪。或者&#xff0c;接手一个老项目&#xff0c;里…...

PECVD vs 磁控溅射:氮化硅薄膜制备工艺全解析(附击穿场强测试数据)

PECVD与磁控溅射&#xff1a;氮化硅薄膜工艺的深度博弈与性能优化 在半导体器件制造和MEMS传感器领域&#xff0c;氮化硅薄膜作为关键功能材料&#xff0c;其介电性能和结构特性直接影响器件可靠性。当前工业界主要采用等离子体增强化学气相沉积&#xff08;PECVD&#xff09;和…...

告别Redis?在CentOS 7上快速体验国产TongRDS 2.2.x(附与SpringBoot整合对比)

国产内存数据库TongRDS技术评估与SpringBoot整合实战 在技术架构选型的关键时刻&#xff0c;国产基础软件的成熟度与性能表现成为越来越多企业关注的焦点。作为Redis的潜在替代方案&#xff0c;TongRDS凭借其纯Java架构和与Redis协议的高度兼容性&#xff0c;正在技术社区引发热…...

FigmaCN:5分钟快速实现Figma中文界面的终极解决方案

FigmaCN&#xff1a;5分钟快速实现Figma中文界面的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文界面而烦恼吗&#xff1f;figmaCN是一款专为中文用户打造…...

北京大学钟亦武老师招收博士生、实习生

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达冲刺今年春招、秋招和实习&#xff01;大家快加入2026年AI校招群&#xff01;赠送今年最大的80元优惠券&#xff0c;大家扫码下方二维码即可加群学习&#xff01;北京大学智能学院介绍&#x…...

OpenClaw镜像体验:无需本地安装快速测试Qwen3.5-4B-Claude

OpenClaw镜像体验&#xff1a;无需本地安装快速测试Qwen3.5-4B-Claude 1. 为什么选择云端镜像方案 上周我在本地尝试部署OpenClaw时&#xff0c;被Node版本冲突和系统权限问题折磨了整整两天。当看到星图平台提供预装好的OpenClawQwen3.5-4B-Claude镜像时&#xff0c;立刻决定…...

个人开发者如何高效率APP上架安卓应用市场?软著、备案、资质、审核详解大全,一篇文章讲透流程规则!

一、上架前的资质准备 1. 软件著作权登记证书&#xff08;软著&#xff09; 软著是证明APP拥有自主知识产权的重要文件&#xff0c;多数应用商店要求上架时提供。申请周期通常为1-2个月&#xff0c;建议提前规划。 2. APP备案 根据工信部要求&#xff0c;APP主办者需要在接…...