shell呈现数据

news2024/9/22 5:30:08

shell脚本编程系列


理解输入和输出

目前为止了解了两种显示脚本输出的方法:在显示器屏幕上显示输出,将输出重定向到文件中,这两种方法将数据输出全部显示出来,要么什么都不显示,但有时一部分数据显示屏幕上,另一部分保存文件更合适。

标准文件描述符

Linux系统会将每个对象当做文件来处理,包括输入和输出。
Linux用文件描述符来标识每个文件对象,文件描述符是一个非负证书,唯一会标识的是会话中打开的文件。
bash shell保留前3个文件描述符(0,1,2)

  • 0 STDIN 标准输入
    代表shell的标准输入,对终端界面来说,标准输入就是键盘。shell会从STDIN文件描述符对应的键盘获得输入并进行处理。
    使用输入重定向符<,Linux会用重定向指向的文件替换标准输入描述符。
    当在命令行中只输入cat命令时,会从STDIN接收输入,输入一行,cat命令就会显示一行。
    在这里插入图片描述
    使用重定向符强制cat命令接收来自STDIN之外的文件输入。
    在这里插入图片描述

  • 1 STDOUT 标准输出
    shell的标准输出,在终端界面上,标准输出就是终端显示器。
    在默认情况下,绝大多数的bash命令会将输出送往STDOUT文件描述符。
    可以通过重定向将标准输出改为其他目的地,其中>为覆写,而>>为追加。
    在这里插入图片描述

当产生错误消息时,shell并未将消息重定向到指定文件。
在这里插入图片描述

  • 2 STDERR 标准错误
    shell或运行在shell中的程序和脚本报错时,生成的错误消息都会送到标准错误输出。
    默认情况下,STDERR和STDOUT指向同一个地方,默认为显示器。
    STDERR并不会随着STDOUT的重定向发生改变。
重定向错误
  • 只重定向错误
    STDERR的文件描述符为2,可以将该文件描述符索引值放在重定向符号之前,只重定向错误消息
    在这里插入图片描述
  • 重定向错误消息和正常输出
    1> 正常输出重定向 2>错误重定向
    在这里插入图片描述
    可以将STDERR和STDOUT的输出重定向到同一个文件,使用特殊的重定向符&>即可
    在这里插入图片描述

在脚本中重定向输出

  • 临时重定向
    在脚本中,重定向到文件描述符时,必须在文件描述符索引值之前加一个&,比如错误重定向 >&2
#!/bin/bash
# testing STDERR messages

echo "This is an error" >&2
echo "This is normal output"

在这里插入图片描述
通过在脚本中将内容重定向到错误描述符,然后在执行脚本时,再将错误描述符重定向

./test8.sh 2> test9

在这里插入图片描述

  • 永久重定向
    使用exec命令,告诉shell在脚本执行期间重定向某个特定文件描述符
#!/bin/bash
# redirecting all output to a file
exec 1>testout

echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line"

在这里插入图片描述
在脚本执行过程中重定向STDOUT

#!/bin/bash
# redirecting output to different locations

exec 2>testerror

echo "This is the start of the script"
echo "now redirecting all output to another location"

exec 1>testout

echo "This output should go to the testout file"
echo "but this should go to the testerror file" >&2

在这里插入图片描述

在脚本中重定向输入

exec 0< testfile 从testfile中而不是键盘上获取输入

#!/bin/bash
# redirecting file input

exec 0< testfile
count=1

while read line
do
   echo "Line #$count: $line"
   count=$[ $count + 1 ]
done

在这里插入图片描述
前面介绍过使用read命令读取用户在键盘上输入的数据,将STDIN重定向为文件后,当read命令试图从STDIN读入数据时,就会从文件而不是键盘上检索数据

创建自己的重定向

  • 创建输出文件描述符
    使用exec命令分配用于输出的文件描述符,比如exec 3> test13out将文件描述符3重定向到了另一个文件,当执行echo语句后面有 >&3时重定向到文件描述符3的输出会进入另一个文件,当然也可以通过 exec 3>>test13out进行追加写入
    在这里插入图片描述

  • 重定向文件描述符
    有一个技巧可以帮助恢复已重定向的文件描述符。比如先将STDOUT的原先位置重定向到另一个文件描述符,然后再利用该文件描述符恢复STDOUT
    在这里插入图片描述

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

    #!/bin/bash
    # redirecting input file descriptors
    
    exec 6<&0
    
    exec 0< testfile
    
    count=1
    while read line
    do
       echo "Line #$count: $line"
       count=$[ $count + 1 ]
    done
    exec 0<&6
    read -p "Are you done now? " answer
    case $answer in
    Y|y) echo "Goodbye";;
    N|n) echo "Sorry, this is the end.";;
    esac
    
  • 创建读/写文件描述符
    尽管看起来奇怪,但是可以打开单个文件描述符兼做输入和输出,但是需要特别小心

    #!/bin/bash
    # testing input/output file descriptor
    
    exec 3<> testfile
    read line <&3
    echo "Read: $line"
    echo "This is a test line" >&3
    

    在这里插入图片描述

  • 关闭文件描述符
    如果创建了新的输入文件描述符或者输出文件描述符,那么shell会在脚本退出时自动将其关闭.
    在有一些情况下,需要在脚本结束前手动关闭文件描述符。要关闭文件描述符,只需要将其重定向到特殊符号&-即可。比如 exec 3>&-会关闭文件描述符3,不再在脚本中使用。

    #!/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
    

    在这里插入图片描述

    如果已经关闭了文件描述符,随后又打开一个,那么会覆盖已有文件

    #!/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
    [root@192 Chapter15-Scripts]# ./test17.sh
    This is a test line of data
    

    在这里插入图片描述

列出打开的文件描述符

lsof命令会列出整个Linux系统打开的所有文件描述符,包括所有后台进程以及登录用户打开的文件。lsof命令可以使用-p指定进程ID,-d指定要显示的文件描述符编号。另外如果要执行进程的当前PID,可以使用特殊环境变量$$。-a选项则用于对两个选项的结果执行AND运算。

lsof -a -p $$ -d 0,1,2

在这里插入图片描述
多打开一些文件描述符

#!/bin/bash
# testing lsof with file descriptors

exec 3> test18file1
exec 6> test18file2
exec 7< testfile

/usr/sbin/lsof -a -p $$ -d0,1,2,3,6,7

在这里插入图片描述

抑制命令输出

有时候你可能不想脚本输出,将脚本作为后台进程运行时这很常见,如果在后台运行的脚本出现错误信息,那么shell就会将其通过邮件发送给进程属主,这会很麻烦
可以将STDERR重定向到一个名为null文件的特殊文件,跟它的名字很像,null文件里面什么都没有,shell输出到null文件的任何数据都不会被保存,全部会被丢弃。Linux中,null文件的标准位置是/dev/null,重定向到该位置的数据都会被丢弃

ls -al > /dev/null

在这里插入图片描述

也可以在输入重定向中将/dev/null作为输入文件,由于/dev/null不含任何内容,因此通常可以使用它来清空现有文件中的数据

cat /dev/null > testfile

在这里插入图片描述

使用临时文件

  • 创建本地临时文件
    Linux系统有一个专供临时文件使用的特殊目录/tmp,其中存放不需要永久保留的文件,在启动时会自动删除/tmp目录的所有文件。
    系统中的任何用户都有权限读写/tmp目录中的文件。
    默认情况下,mktemp会在本地目录中创建一个文件,在使用该命令时,需指定一个文件名模板,模板可以包含任意文本字符,同时在文件名末尾加上6个X

     mktemp testing.XXXXXX
    

    在这里插入图片描述

    可以创建多个临时文件,并确保每个文件名都不重复
    在这里插入图片描述

    mktemp命令的输出正是创建的临时文件,这样在脚本中使用该命令时,可以将文件名保存到变量中,在随后的脚本中就能使用了

    #!/bin/bash
    # creating and using a temp file
    
    tempfile=$(mktemp test19.XXXXXX)
    
    exec 3>$tempfile
    
    echo "This script writes to temp file $tempfile"
    
    echo "This is the first line" >&3
    echo "This is the second line." >&3
    echo "This is the last line." >&3
    exec 3>&-
    
    echo "Done creating temp file. The contents are:"
    cat $tempfile
    rm -f $tempfile 2> /dev/null
    

    在这里插入图片描述

  • 在/tmp目录中创建临时文件
    -t选项会强制mktemp命令在系统的临时目录中创建文件,此时命令会返回临时文件的完整路径名,而不是文件名

    mktemp -t test.XXXXXX
    

    在这里插入图片描述

    #!/bin/bash
    # creating a temp file in /tmp
    
    tempfile=$(mktemp -t tmp.XXXXXX)
    
    echo "This is a test file." > $tempfile
    echo "This is the second line of the test." >> $tempfile
    
    echo "The temp file is located at: $tempfile"
    cat $tempfile
    rm -f $tempfile
    

    在这里插入图片描述

  • 创建临时目录
    -d选项会告诉mktemp命令创建一个临时目录

    #!/bin/bash
    # using a temporary directory
    
    tempdir=$(mktemp -d dir.XXXXXX)
    cd $tempdir
    tempfile1=$(mktemp temp.XXXXXX)
    tempfile2=$(mktemp temp.XXXXXX)
    exec 7> $tempfile1
    exec 8> $tempfile2
    
    echo "Sending data to directory $tempdir"
    echo "This is a test line of data for $tempfile1" >&7
    echo "This is a test line of data for $tempfile2" >&8
    

    在这里插入图片描述

记录消息

有时候需要将消息同时送往显示器和文件,与其对输出进行两次重定向,不如使用特殊的tee命令,它能将来自STDIN的数据同时送往两处。一处是STDOUT,另一处是tee命令行指定的文件名。通常用来配合管道命令来重定向命令输出

 date | tee testfile

在这里插入图片描述
如果想追加数据到指定文件中,比如使用-a选项

#!/bin/bash
# using the tee command for logging

tempfile=test22file

echo "This is the start of the test" | tee $tempfile
echo "This is the second line of the test" | tee -a $tempfile
echo "This is the end of the test" | tee -a $tempfile

在这里插入图片描述

总结

在创建脚本时,能够理解bash shell如何处理输入和输出会带来很多方便。你可以改变脚本获取数据和显示数据的方式,对脚本进行定制以适应各种环境。脚本的输入/输出都可以从标准输入(STDIN)/标准输出(STDOUT)重定向到系统中的任意文件。
除了STDOUT,你可以通过重定向STDERR来改变错误消息的流向。这是通过重定向与STDERR关联的文件描述符(文件描述符2)来实现的。你可以将STDERR和STDOUT重定向到同一个文件,也可以重定向到不同的文件,以此区分脚本的正常输出和错误消息。
bash shell允许在脚本中创建自己的文件描述符。你可以创建文件描述符3到8,将其分配给要用的任何输出文件。一旦创建了文件描述符,就可以利用标准的重定向符号将任意命令的输出重定向到那里。
bash shell也允许重定向输入,这样就能方便地将文件数据读入脚本。你可以通过lsof命令来显示shell中使用的文件描述符。
Linux系统提供了一个特殊文件/dev/null,用于重定向无用的输出。Linux系统会丢弃重定向到/dev/null的任何数据。你也可以通过将/dev/null的内容重定向到文件来清空该文件的内容。
mktemp命令很有用,它可以直接创建临时文件和目录。只需给mktemp命令指定一个模板,它就能在每次调用时基于该文件模板的格式创建一个唯一的文件。你也可以在Linux系统的/tmp目录中创建临时文件和目录,系统启动时会清空这个特殊位置中的内容。
tee命令便于将输出同时发送给标准输出和日志文件,这样你就可以在屏幕上显示脚本消息的同时,将其保存到日志文件中。

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

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

相关文章

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中&#xff0c;都会线加载一张图片然后再进入闪屏页。这样&#xff0c;可以给用户很好的体验。 作用&#xff1a;避免加载白屏页面&#xff0c;进行业务的预处理&#xff08;网络检测、数据预加载...&#xff09; 界面组成…

基于Pyqt5快速构建应用程序详细教程

一、介绍 图形用户界面&#xff0c;更广为人知的名称是 GUI&#xff0c;是当今大多数个人计算机的一个特征。 它为不同计算技能水平的用户提供了直观的体验。 尽管 GUI 应用程序可能会使用更多资源&#xff0c;但由于其点击式特性&#xff0c;它们通常对用户友好。 PyQt 是可用…

最小生成树|二分图

最小生成树跟边的正负没有任何关系。 最小生成树 朴素Prime 该算法和Dijkstr算法很像。 先把所有距离初始化为正无穷 进行n次迭代 找到不在集合&#xff08;集合指当前的生成树&#xff09;当中的点&#xff0c;s数组表示当前已经在连通块&#xff08;生成树&#xff09;中的所…

vue-simple-uploader在VUE3中分片上传大文件

vue-simple-uploader是一个优秀的大文件分片上传组件&#xff0c;在vue2里面工作一切正常&#xff0c;但是在vue3里面却发现了一些问题&#xff1a; &#xff08;1&#xff09;在element-plus的el-dialog里面渲染失败&#xff1b; &#xff08;2&#xff09;上传进度条不能正…

由浅入深详解四种分布式锁

在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁或者Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁&#xff0c;在单个JVM进程中提供线程之间的锁…

信息系统项目管理师,第四版应该如何应对

一、 改版情况。 2023年3月&#xff0c;新版教材起售。 2023年4月4日&#xff0c;官网宣布本次考试第三版第四版兼顾使用。 以历年的考试时间来看&#xff0c;一般这次考试是在 5月27日、28日附近。 接下来只有一个月左右的时间了。给大家聊聊面对现在这个情况如何备考。 …

考研计算机组成原理总结(7)

一.虚拟存储器 1.基本知识 主存和辅存共同构成了虚拟存储器&#xff0c;二者在硬件和系统软件的共同管理下工作。对于应用程序员而言&#xff0c;虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。 2.基本概念 虚拟存储器将主存或辅存的地址空间统一编址&#x…

如何提高图片清晰度?三种方法来帮你!

如何提高图片清晰度&#xff1f;图片在上传到网络后会被压缩&#xff0c;导致图片变得模糊。今天&#xff0c;我将分享三种方法&#xff0c;帮助您提高图片的清晰度。 方法一&#xff1a;使用记灵在线工具 工具地址&#xff1a;记灵在线工具 - 更专注于发现工具的实用性 该工…

[Linux 命令] ls 显示目录内容列表

ls 显示目录内容列表 思维导图 补充说明 ls命令 就是list的缩写&#xff0c;用来显示目标列表&#xff0c;在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示&#xff0c;以分区不同类型的文件。 语法 ls [选项] [文件名...][-1abcdfgiklmnopqrstuxABCD…

Node.js下载安装与简单使用

一、下载Node.js 打开链接&#xff1a;Node.js 的官网首页&#xff08;https://nodejs.org/en/&#xff09; 选择左边的 LTS 版本和 Current 版本的不同 1.LTS 为长期稳定版&#xff0c;对于追求稳定性的企业级项目来说&#xff0c;推荐安装 LTS 版本的 Node.js。 2.Current …

【系统集成项目管理工程师】项目质量管理

&#x1f4a5;十大知识领域&#xff1a;项目质量管理 项目质量管理包括以下 3 个过程: 规划质量管理实施质量保证质量控制 一、规划质量管理 规划质量管理是识别项目及其可交付成果的质量要求和标准&#xff0c;并准备对策确保符合质量要求的过程 这部分重点主要是工具与技术 1…

C语言从入门到精通第8天(分支结构if、else、switch的使用)

分支结构if、else、switch的使用 if语句if...else语句if...else嵌套if...else if...else语句switch语句 if语句 语法&#xff1a; if(表达式){ 语句&#xff1b; } 如果表达式为真&#xff0c;则执行{}里面的语句。如果为假&#xff0c;则不执行。示例代码&#xff1a; int m…

春秋云镜:CVE-2022-25488(SQL报错注入)

目录 一、题目 二、sqlmap梭哈查flag 一、题目 介绍&#xff1a; Atom CMS v2.0存在sql注入漏洞在/admin/ajax/avatar.php页面 进入题目; 发现是Not Found页面 一开始以为打开的问题&#xff1a; 一想 我们要访问的是/admin/ajax/avatar.php 访问后是空白页面&#xff1a…

进程树pstree介绍

进程树&#xff08;pstree&#xff09;是一个Linux/Unix命令&#xff0c;用于显示系统中所有进程的层次结构。它可以将进程展示为树形结构&#xff0c;其中每个进程都是一个节点&#xff0c;而每个节点下面的子节点是该进程的子进程。pstree可以按照进程的父子关系显示进程&…

[架构之路-172]-《软考-系统分析师》-5-数据库系统-5- 数据库设计与建模(逻辑设计-实体关系图ER图-关系图、物理设计)

目录 5 . 5 数据库设计与建模 5.5.1数据库设计阶段 1 . 规划&#xff1a;为什么做&#xff1f;能不能做&#xff1f; 2 . 需求分析&#xff1a;做成什么样子&#xff1f; 3 . 概念设计&#xff1a;怎么做 - 概念 &#xff08;用户&#xff09; 4 . 逻辑设计&#xff1a;怎…

p66 内网安全-域横向批量atschtasksimpacket

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 基本概念 DMZ区域&#xff1a;称为“隔离区”&#xff0c;也称‘’非军事化区/停火区…

C语言入门篇——数据篇

目录 1、变量与常量 1.1变量 1.2常量 1.2.1#define 定义的标识符常量 1.2.2枚举常量 2、数据类型关键字 3、整数 4、浮点数 5、基本数据类型 5.1、int型数据 5.2、char型数据 5.3、_Bool类型 5.4、float、double和long double 5.5、复数和虚数类型 6、总结 1、变…

Preempt-RT实时系统下IGH主站安装

文章目录 1. 安装环境2. 确定网卡类型3. 下载IGH安装包4. 配置安装5. 启动测试6. 扫描从站7. 设置环境变量 1. 安装环境 ubuntu18.04内核版本&#xff1a;4.19.72-rt25 2. 确定网卡类型 查看网卡驱动 lspci -v可以看到我的网卡驱动主要有e1000e和igb两种类型&#xff0c;其…

localhost与本机IP IPtables匹配顺序

localhost&host IPtables iptables链匹配顺序 ping localhost 当前实验网络为IPV4模式通过tcpdump抓包&#xff0c;我们可以发现ping localhost的流量最终发送到lo网卡了通过iptables pkts数据计数我们可知&#xff0c;ping localhost的iptables过滤流程为&#xff1a;应…

npm install 卡住 不动弹

npm install时如果卡住&#xff0c;不动弹&#xff0c;可以试试以下几种方式。 设置注册中心&#xff0c;使用淘宝注册中心。 这种主要解决因为网络问题引起的下载失败&#xff0c;npm config set registry https://registry.npmmirror.com&#xff0c;设置完后使用npm config…