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

【Linux】数据呈现

一、数据的输入与输出

1、标准文件描述符

Linux系统会将每个对象都当做文件来处理,包括输入和输出。它用文件描述符来标识每个文件对象。

文件描述符是一个非负整数,唯一会标识的是会话中打开的文件。每个进程一次最多可以打开9个文件描述符。bash shell保留了前3个文件描述符:0、1、2

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

详细描述及示例参见另一篇文章:

【Linux】重定向、管道符、通配符、转义字符、环境变量-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/lemon9597/article/details/144185920?sharetype=blogdetail&sharerId=144185920&sharerefer=PC&sharesource=lemon9597&spm=1011.2480.3001.8118

2、在脚本中重定向输出

临时重定向

只需要使用重定向符号(>)将输出重定向到STDERR文件描述符(2),但在重定向到文件描述符时,必须在文件描述符前加一个 &

#!/bin/bashecho
echo "错误消息!!" >&2
echo "正常输出!!"
echo
exit

正常运行脚本,看不出区别:因为STDERR和STDOUT在默认下都是输出到屏幕的。

但如果在运行脚本时重定向STDERR,那么脚本中的所有送往STDERR的文本都会被重定向。

 

永久重定向:exec命令

 exec命令会告诉shell脚本在执行期间重定向某个特定文件描述符,它会启动一个新的shell并将STDOUT文件描述符重定向到指定文件。

#!/bin/bashexec 1>testout #将所有输出都重定向到testout文件echo "你好!"
echo "wen ning"

也可以在脚本执行过程中重定向STDOUT:

#!/bin/bashexec 2>testerrorecho "正常输出1"
echo "正常输出2"exec 1>testoutecho "这一句应该送往testout文件。"
echo "而这一句应该送往testerror文件。" >&2exit

3、在脚本中重定向输入

exec命令允许将STDIN重定向为文件:exec 0< file(此命令会告诉shell,它应该从文件file中而不是键盘上获取输入。)

#!/bin/bashexec 0< test.txt
count=1while read line
doecho "第$count:$line"count=$[ $count + 1 ]
done
exit

将STDIN重定向为文件后,当read命令试图从STDIN读入数据时,就会直接到文件tesh.txt中而不是键盘上检索数据。 

 4、创建用户自己的重定向

替代性文件描述符从3到8共有6个,都可用作输入或输出重定向(如果使用大于9的文件描述符,可能会与shell内部使用的文件描述符发生冲突),这些文件描述符中的任意一个都可以分配给文件并用在shell脚本中。

创建输出文件描述符

使用exec命令分配用于输出的文件描述符。一旦替代性文件描述符指向文件,此重定向就会一直有效,直至重新分配。

#!/bin/bash
exec 5>testout1echo "你好,你好!"
echo "Hello,world!" >&5
echo "大家好!"

也可以直接追加拗现有文件而不用创建新文件。

exec 5>>testout1 

创建输入文件描述符

 在重定向到文件之前,先将STDIN指向的位置保存到另一个文件描述符,然后读取完文件之后,将STDIN恢复到原先的位置。

#!/bin/bashexec 5<&0 # 文件描述符5保存STDIN指向的位置exec 0< test.txt # 将test.txt文件重定向到STDIN,后续read命令的所有输入都会来自这个文件count=1
while read line
do echo "第$count行:$line"count=$[ $count + 1 ]
done
exec 0<&5 # 读完文件里的所有内容后,将STDIN重定向到文件描述符5,即恢复STDIN原先读取来自屏幕的输入read -p "已经结束了吗?" answer # 用来测试STDIN是否已经恢复到从屏幕读取输入
case $answer inY|y) echo "已经结束了!";;N|n) echo "还没有结束!";;
esac
exit

创建读写共用的文件描述符

暂无,请上网查询

关闭文件描述符

创建了新的输入or输出文件描述符后,shell会在脚本退出时自动将其关闭。可有时候,需要在脚本退出前手动关闭文件描述符。

关闭文件描述符只需将其重定向到特殊符号 &- 即可:exec 3>&-

#!/bin/bashexec 3> test1
echo "123456" >&3exec 3>&-echo "测试能否写进去?" >&3

 一旦关闭了文件描述符,就不能在脚本中向里面写入任何数据,否则就会报警

在关闭文件描述符后,如果又打开它,此时shell就会用一个新文件替换已有文件,如果你输出数据,它就会覆盖已有文件。

#!/bin/bashexec 3>test2echo "123456" >&3
exec 3>&-cat test2
exex 3> test2
echo "222222" >&3

 


http://www.mrgr.cn/news/81423.html

相关文章:

  • 数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误
  • ShenNiusModularity项目源码学习(5:jwt身份认证)
  • 浅谈Java注解之ResponseBody
  • 批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片
  • 基于卷积神经网络融合Inception模块的人脸识别
  • Naive UI 多选框自定义tag和label
  • Redis 介绍和安装
  • 小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
  • 服务端高并发分布式结构演进之路
  • 使用 acme.sh 申请域名 SSL/TLS 证书完整指南
  • 【Java基础-27】Java中的访问修饰符:分类、作用及应用场景
  • 2.利用docker进行gitlab服务器迁移
  • 面试记录24年新
  • Javaweb (二) | Cookie、Session
  • clickhouse解决suspiciously many的异常
  • Debian12 安装配置 ODBC for GaussDB
  • 攻防世界 PHP2
  • Python8-写一些小作业
  • AI科研助手开发总结:向量与数据权限的应用(一)
  • 【ROS2】坐标TF发布(静态)
  • 攻防世界 view_source
  • 攻防世界 ics-06
  • 【linux】NFS实验
  • WebRTC服务质量(08)- 重传机制(05) RTX机制
  • 用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容
  • 【RAII | 设计模式】C++智能指针,内存管理与设计模式