shell_57.Linux创建自己的重定向

创建自己的重定向
1.创建输出文件描述符
可以用 exec 命令分配用于输出的文件描述符。和标准的文件描述符一样,一旦将替代性文件描述符指向文件,
此重定向就会一直有效,直至重新分配。

$ cat test13 
#!/bin/bash 
# using an alternative file descriptor 
exec 3>test13out 
echo "This should display on the monitor" 
echo "and this should be stored in the file" >&3 
echo "Then this should be back on the monitor" 
$ ./test13 
This should display on the monitor 
Then this should be back on the monitor 
$ cat test13out 
and this should be stored in the file 
$

也可以不创建新文件,而是使用 exec 命令将数据追加到现有文件:

exec 3>>test13out


2.重定向文件描述符
可以将另一个文件描述符分配给标准文件描述符,反之亦可。
这意味着可以将 STDOUT 的原先位置重定向到另一个文件描述符,然后再利用该文件描述符恢复 STDOUT。

$ cat test14 
#!/bin/bash 
# storing STDOUT, then coming back to it 
exec 3>&1 
exec 1>test14out 
echo "This should store in the output file" 
echo "along with this line." 
exec 1>&3 
echo "Now things should be back to normal" 
$ 
$ ./test14 
Now things should be back to normal 
$ cat test14out 
This should store in the output file 
along with this line. 
$


第一个 exec 命令将文件描述符 3 重定向到了文件描述符 1(STDOUT)的当前位置,也就是显示器。这意味着任何送往文件描述符 3 的输出都会出现在屏幕上。
第二个 exec 命令将 STDOUT 重定向到了文件,shell 现在会将发送给 STDOUT 的输出直接送往该文件。但是,文件描述符 3 仍然指向 STDOUT 原先的位置(显示器)。
如果此时将输出数据发送给文件描述符 3,则它仍然会出现在显示器上,即使 STDOUT 已经被重定向了。
第三个 exec 命令将 STDOUT 重定向到了文件描述符 3 的当前位置(现在仍然是显示器)。这意味着现在 STDOUT 又恢复如初了,即指向其原先的位置——显示器。


3.创建输入文件描述符
可以采用和重定向输出文件描述符同样的办法来重定向输入文件描述符。在重定向到文件之前,先将 STDIN 指向的位置保存到另一个文件描述符,
然后在读取完文件之后将 STDIN 恢复到原先的位置:

$ cat test15
#!/bin/bash
# redirecting input file descriptors
exec 6<&0
exec 0< testfile
count=1
while read line
doecho "Line #$count: $line"count=$[ $count + 1 ]
done
exec 0<&6
read -p "Are you done now? " answer
case $answer inY|y) echo "Goodbye";;N|n) echo "Sorry, this is the end.";;
esac
$ ./test15
Line #1: This is the first line.
Line #2: This is the second line.
Line #3: This is the third line.
Are you done now? y
Goodbye
$


文件描述符 6 用于保存 STDIN 指向的位置。然后脚本将 STDIN 重定向到一个文件。
read 命令的所有输入都来自重定向后的 STDIN(也就是输入文件)。
在读完所有行之后,脚本会将 STDIN 重定向到文件描述符 6,恢复 STDIN 原先的位置。
该脚本使用另一个 read 命令来测试 STDIN 是否恢复原位,这次 read 会等待键盘的输入。


4.创建读/写文件描述符

$ cat test16
#!/bin/bash
# testing input/output file descriptor
exec 3<> testfile
read line <&3
echo "Read: $line"
echo "This is a test line" >&3
$ cat testfile
This is the first line. 
This is the second line. 
This is the third line. 
$ ./test16 
Read: This is the first line. 
$ cat testfile 
This is the first line. 
This is a test line 
ine. 
This is the third line. 
$


exec 命令将文件描述符 3 用于文件 testfile 的读和写。接下来,使用分配好的文件描述符,通过 read 命令读取文件中的第一行,然后将其显示在 STDOUT 中。
最后,使用echo 语句将一行数据写入由同一个文件描述符打开的文件中。
在运行脚本时,一开始还算正常。输出内容表明脚本读取了 testfile 文件的第一行。但如果在脚本运行完毕后查看 testfile 文件内容,则会发现写入文件中的数据覆盖了已有数据。
当脚本向文件中写入数据时,会从文件指针指向的位置开始。read 命令读取了第一行数据,这使得文件指针指向了第二行数据的第一个字符。
当 echo 语句将数据输出到文件时,会将数据写入文件指针的当前位置,覆盖该位置上的已有数据。


5.关闭文件描述符
如果创建了新的输入文件描述符或输出文件描述符,那么 shell 会在脚本退出时自动将其关闭。然而在一些情况下,需要在脚本结束前手动关闭文件描述符。
要关闭文件描述符,只需将其重定向到特殊符号&-即可。在脚本中如下所示:

exec 3>&- 


该语句会关闭文件描述符 3,不再在脚本中使用。下面的例子演示了试图使用已关闭的文件描述符时的情况:

$ cat badtest 
#!/bin/bash 
# testing closing file descriptors 
exec 3> test17file 
echo "This is a test line of data" >&3 
exec 3>&- 
echo "This won't work" >&3 
$ ./badtest 
./badtest: 3: Bad file descriptor 
$ 


一旦关闭了文件描述符,就不能在脚本中向其写入任何数据,否则 shell 会发出错误消息。


6.如果随后你在脚本中打开了同一个输出文件,那么shell 就会用一个新文件来替换已有文件。
这意味着如果你输出数据,它就会覆盖已有文件。来看下面这个例子:

$ cat test17 
#!/bin/bash 
# testing closing file descriptors 
exec 3> test17file 
echo "This is a test line of data" >&3 
exec 3>&- 
cat test17file 
exec 3> test17file 
echo "This'll be bad" >&3 
$ ./test17 
This is a test line of data 
$ cat test17file 
This'll be bad' 
$

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

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

相关文章

Qt Creator标准使用技巧

在任何一款编程的 IDE 软件里,都有相应的编程技巧。在这章里我们主要这两种最常用的技巧——Qt Creator 的快捷键的使用和 Qt 的帮助文档的使用。其中最重要的就是 Qt 的帮助文档里。可以说 Qt 帮助文档其实就是一本教程,任何其他的 Qt 教程都没有 Qt 文档写的详细,只不过是…

【JVM】垃圾回收机制

【JVM】垃圾回收机制 文章目录 【JVM】垃圾回收机制1. 方法区的回收2. 堆的回收2.1 引用计数法2.2 可达性分析算法 3. 对象引用3.1 强引用3.2 软引用3.3 弱引用3.4 虚引用和终结器引用 4. 垃圾回收算法4.1 标记清除算法4.2 复制算法4.3 标记整理算法4.4 分代垃圾回收算法 5. 垃…

202310-宏基组学物种分析工具-MetaPhlAn4安装和使用方法-Anaconda3- centos9 stream

MetaPhlAn 4是一种基于DNA序列的微生物组分析工具&#xff0c;它能够从宏基因组测序数据中识别和分离微生物的组成。以下是安装和使用MetaPhlAn 4的步骤&#xff1a; 安装MetaPhlAn 4&#xff1a; 裸机环境&#xff0c;手动安装 1. 安装依赖项&#xff1a; MetaPhlAn 4需要…

FreeRTOS_信号量之二值信号量

目录 1. 信号量简介 2. 二值信号量 2.1 二值信号量简介 2.1.1 二值信号量无效 2.1.2 中断释放信号量 2.1.3 任务获取信号量成功 2.1.4 任务再次进入阻塞态 2.2 创建二值信号量 2.2.1 vSemaphoreCreateBinary() 2.2.2 xSemaphoreCreateBinary() 2.2.3 xSemaphoreCrea…

算法的时间复杂度及空间复杂度

目录 一、前言 二、时间复杂度 1.时间复杂度定义 2.时间复杂度描述方法 三、实例代码 实例1&#xff08;取影响最大的项&#xff09; 实例2&#xff08;舍去系数&#xff09; 实例3&#xff08;不确定大小关系的用max函数取最大&#xff09; 实例4&#xff08;常数次的…

编译运行windows+OpenMVG+OpenMVS+vs2017

安装vcpkg过程需要翻墙&#xff01;&#xff01;&#xff01; github下载代码 git clone https://github.com/microsoft/vcpkg git clone https://github.com/cdcseacave/VCG.git git clone https://github.com/cdcseacave/openMVS.git src安装vcpkg包 cd .\vcpkg .\bootstr…

HC32M120时钟配置内部时钟为48MHz

HC32M120 时钟比较简单&#xff0c;外部时钟最高只支持20MHz&#xff0c;并且没有PLL&#xff0c;想要48M时钟只能通过内部HRC时钟配置&#xff0c;经过一番研究发现可以直接在hc32m120_icg.h中配置上电时钟为48MHz即可&#xff0c;如果不配置直接使用CLK_HRCInit(CLK_HRC_ON, …

AcWing92 递归实现指数型枚举:输出1~n的所有子集

题目 从 1∼ n n n 这 n n n 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入格式 输入一个整数 n n n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 1 个空格隔开。 对于没有选任何数的方案&#xff0c…

“第五十五天”

定点数&#xff1a; 原码的乘法&#xff1a; 乘法的符号位是单独处理的&#xff08;通过对被乘数和乘数的符号位进行异或实现&#xff09;&#xff0c;数值位去绝对值进行运算。这里的乘法实际上是通过多次加法实现的。 这里被乘数是放在x寄存器&#xff0c;乘数放在MQ寄存器…

【SpringBoot】Docker部署

docker部署是主流的部署方式&#xff0c;极大的方便了开发部署环境&#xff0c;保持了环境的统一&#xff0c;也是实现自动化部署的前提。 1 项目的目录结构 package: 点击打包&#xff0c;生成 xxx-SNAPSHOT.jar target目录: 打包生成目录&#xff0c;生成的jar存放位置Docke…

三种前端埋点方式

什么是埋点 埋点是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 我们可以知道埋点实际上是对特定事件或…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

10.30 知识总结(标签分类、css介绍等)

一、 标签的分类 1.1 单标签 img br hr <img /> 1.2 双标签 a h p div <a></a> 1.3 按照标签属性分类 1.3.1 块儿标签 即自己独自占一行 h1-h6 p div 1.3.2 行内(内联)标签 即自身文本有多大就占多大 a span u i b s 二、 标签的嵌套 标签之间是可以互相…

iTransformer: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING

#论文题目&#xff1a;ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING #论文地址&#xff1a;https://arxiv.org/abs/2310.06625 #论文源码开源地址&#xff1a;https://github.com/thuml/Time-Series-Library #论文所属会议&#xff1a;Mach…

基于单片机的智能清洁小车设计—控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的主要内容和目标二、总体方案设计2.1智能清洁小车的硬件系统组成2.2智能清洁小车的硬件结构图 三、 小车结构设计5.1基本布局和功能分析5.2小车二维及三维图小车三维图&#xff1a; 四、 原理图程序 五、…

在CentOS 7中手工打造和运行xml文件配置的Servlet,然后使用curl、浏览器、telnet等三种工具各自测试

下载Openjdk并配置环境变量 https://jdk.java.net/java-se-ri/11-MR2是官网下载Openjdk 11的地方。 sudo wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz下载openjdk 11。 sudo mkdir -p /usr/openjdk11创建目录&#xff…

UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

教程https://www.youtube.com/watch?vsWpENaVGj2M&listPLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index10&ppiAQB 相关蓝图 连招逻辑 动画通知类 逻辑分析 1.用户输入 已搭载战斗系统模块,可以收到输入指令 2.连击 第一次攻击&#xff1a; 第一次攻击&#xff0c;…

Qt中设置鼠标透明度的应用及示例

Qt中设置鼠标透明度的应用及示例 介绍设置鼠标透明度的方法应用场景遮罩层可视化效果 结论 介绍 Qt是一个功能强大的跨平台应用程序开发框架&#xff0c;可以用于开发各种类型的应用程序。在Qt中&#xff0c;我们可以设置鼠标的透明度&#xff0c;即将鼠标事件传递给下方的控件…

vulnhub momentum 靶机复盘

环境配置 到学校了 原来的桥接配置要改 这里记录几个点备忘 1.virtualbox 桥接 未指定 重新安装驱动VBoxNetLwf.inf 2.配置完靶机启动失败 手动安装VBoxNetLwf.inf 不要用virtualbox自带的netlwfinstall 3.配置完nmap扫不到 rw init/bin/bash 进去看看网卡配置 信息收集…

Docker底层原理:UFS的使用

文章目录 前言检查系统是否支持OverlayFS准备两个目录加载OverlayFS模块创建OverlayFS使用OverlayFS卸载OverlayFS 前言 Linux中常用的联合文件系统有OverlayFS和Aufs(Another Union File System), OverlayFS是Linux内核自带的联合文件系统, 而Aufs则是第三方提供的联合文件系…