shell脚本(完)—脚本互调重定向的学习

免责声明

学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。

笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

脚本互调

在Shell脚本中,脚本互调是指在一个脚本中调用另一个脚本

  1. 使用bashsh命令调用另一个脚本:

#!/bin/bash
# script1.sh# 调用script2.sh
bash script2.sh
  1. 使用source.命令调用另一个脚本:

#!/bin/bash
# script1.sh# 调用script2.sh
source script2.sh
# 或者
. script2.sh

这两种方法有一些区别:

  • 使用bashsh命令调用另一个脚本时,会创建一个新的子shell来执行被调用的脚本。这意味着被调用脚本中的变量和函数不会影响到父脚本。

  • 使用source.命令调用另一个脚本时,会在当前shell中执行被调用的脚本。这意味着被调用脚本中的变量和函数会影响到父脚本。

下面是一个简单的例子,展示了如何在两个脚本之间互调:

script1.sh:

#!/bin/bashecho "Hello from script1"
source script2.sh
echo "Back in script1"

script2.sh:

#!/bin/bashecho "Hello from script2"

运行script1.sh时,输出将会是:

Hello from script1
Hello from script2
Back in script1

这表明script2.shscript1.sh中成功执行,并且变量和函数可以在两个脚本之间共享。

确保在shell脚本中调用外部脚本的权限

在Shell脚本中调用外部脚本时,确保调用方具有适当的权限是很重要的

  1. 确保脚本具有可执行权限。你可以使用chmod命令为脚本添加可执行权限:

chmod +x /path/to/script2.sh
  1. 如果脚本需要特定的用户权限(例如,root权限),请确保以适当的用户身份运行脚本。你可以使用sudo命令以其他用户身份(通常是root)运行脚本:

sudo /path/to/script2.sh
  1. 如果脚本位于受保护的目录中,确保调用方有权限访问该目录。你可以更改目录权限或更改目录所有者以实现这一点。

  2. 如果脚本依赖于其他文件或资源,请确保调用方有权限访问这些资源。

  3. 在脚本中添加错误处理,以便在调用外部脚本时捕获和处理错误。例如:

#!/bin/bash
# script1.sh# 调用外部脚本script2.sh
if ! /path/to/script2.sh; thenecho "Error: Failed to execute script2.sh" >&2exit 1
fi

这将确保在script2.sh执行失败时,script1.sh能够捕获错误并采取适当的措施。

通过遵循这些建议,你可以确保在Shell脚本中调用外部脚本时具有适当的权限。

捕获外部脚本的输出

在Shell脚本中捕获外部脚本的输出,可以使用命令替换(command substitution)功能

  1. 使用反引号(`):

#!/bin/bash
# script1.sh# 调用外部脚本script2.sh并捕获其输出
output=`/path/to/script2.sh`# 打印捕获到的输出
echo "Output from script2.sh: $output"
  1. 使用$():

#!/bin/bash
# script1.sh# 调用外部脚本script2.sh并捕获其输出
output=$( /path/to/script2.sh )# 打印捕获到的输出
echo "Output from script2.sh: $output"

在这两种方法中,/path/to/script2.sh是你要调用的外部脚本。捕获到的输出将存储在变量output中,然后你可以根据需要处理或显示该输出。

例如,假设script2.sh的内容如下:

#!/bin/bash
# script2.shecho "Hello from script2"

运行script1.sh时,输出将会是:

Output from script2.sh: Hello from script2

这表明script1.sh已成功捕获并处理了script2.sh的输出。

捕获外部脚本的错误

在Shell脚本中捕获外部脚本的错误,可以通过检查外部脚本的退出状态码来实现

以下是如何在Shell脚本中捕获外部脚本错误的示例:

#!/bin/bash
# script1.sh# 调用外部脚本script2.sh
/path/to/script2.sh# 检查退出状态码
if [ $? -ne 0 ]; thenecho "Error: script2.sh failed with exit code $?" >&2exit 1
fi# 继续执行后续操作
echo "script2.sh executed successfully"

在这个示例中,/path/to/script2.sh是你要调用的外部脚本。$?变量表示上一个命令(在这种情况下是/path/to/script2.sh)的退出状态码。如果退出状态码不等于0(表示发生了错误),则脚本将打印错误消息并退出。

你还可以使用命令替换和if语句捕获外部脚本的输出和错误,如下所示:

#!/bin/bash
# script1.sh# 调用外部脚本script2.sh并捕获其输出和错误
output=$( /path/to/script2.sh 2>&1 )# 检查退出状态码
if [ $? -ne 0 ]; thenecho "Error: script2.sh failed with exit code $?" >&2echo "Error output: $output" >&2exit 1
fi# 打印捕获到的输出
echo "Output from script2.sh: $output"# 继续执行后续操作
echo "script2.sh executed successfully"

在这个示例中,2>&1将错误输出重定向到标准输出,这样我们就可以使用命令替换同时捕获标准输出和错误输出。然后我们检查退出状态码并根据需要处理错误。

应用方向

在Shell脚本中,脚本互调是指在一个脚本中调用另一个脚本,这在实际应用中非常常见

  1. 模块化:将脚本的功能划分为多个独立的脚本文件,以便于管理和维护。这样可以使每个脚本专注于一个特定的任务,提高代码的可读性和可重用性。

    例如,你可以创建一个名为utility.sh的脚本,其中包含一些通用的函数和实用程序,然后在其他脚本中通过source.命令调用它。

  2. 配置管理:在一个脚本中调用另一个脚本以获取配置信息。例如,你可以创建一个名为config.sh的脚本,其中包含一些环境变量和配置参数,然后在主脚本中调用它以获取这些值。

  3. 任务分解:将一个复杂的任务分解为多个子任务,并为每个子任务创建一个单独的脚本。然后,在主脚本中按顺序调用这些子任务脚本。

    例如,你可以创建一个名为backup.sh的脚本,用于执行数据备份任务。在这个脚本中,你可以调用其他脚本,如clean.sh(用于清理旧数据)、compress.sh(用于压缩数据)和transfer.sh(用于将数据传输到远程服务器)。

  4. 代码复用:在一个脚本中调用另一个脚本以重用已有的代码。这可以避免重复编写相同的代码,提高开发效率。

    例如,你可以创建一个名为logging.sh的脚本,其中包含一些用于记录日志的函数,然后在其他脚本中通过source.命令调用它。

  5. 并行执行:在一个脚本中调用多个脚本,并行执行它们以提高性能。这可以通过使用&符号将脚本放入后台执行,并使用wait命令等待它们完成。

    例如,你可以创建一个名为parallel_tasks.sh的脚本,在其中调用task1.shtask2.shtask3.sh,并使用&符号将它们放入后台执行。然后,使用wait命令等待所有任务完成。

这些只是脚本互调的一些应用场景。实际上,脚本互调是一种非常灵活的技术,可以帮助你更有效地编写和管理Shell脚本。

重定向

在Shell脚本中,重定向是一种将命令的输出(标准输出和/或标准错误)发送到文件、设备或其他命令的操作

  1. 将标准输出重定向到文件:

    使用>将命令的标准输出重定向到文件。如果文件已存在,它将被覆盖。例如:

    echo "Hello, World!" > output.txt
    

    使用>>将命令的标准输出追加到文件。如果文件不存在,它将被创建。例如:

    echo "Hello, again!" >> output.txt
    
  2. 将标准错误重定向到文件:

    使用2>将命令的标准错误重定向到文件。例如:

    command_that_produces_error 2> error.txt
    

    使用2>>将命令的标准错误追加到文件。例如:

    command_that_produces_error 2>> error.txt
    
  3. 将标准输出和标准错误重定向到同一个文件:

    使用&>将命令的标准输出和标准错误重定向到同一个文件。例如:

    command_that_produces_output_and_error &> output_and_error.txt
    

    或者,你可以分别重定向标准输出和标准错误,然后使用>>将它们追加到同一个文件:

    { command_that_produces_output_and_error 2>&1; } >> output_and_error.txt
    
  4. 将标准输出和/或标准错误重定向到其他命令:

    使用管道(|)将一个命令的标准输出重定向到另一个命令的标准输入。例如:

    ls | grep "txt"
    

    使用2>&1将标准错误重定向到标准输出,然后将其传递给另一个命令。例如:

    command_that_produces_error 2>&1 | grep "error"
    

这些是Shell脚本中常用的重定向方法。通过使用这些方法,你可以灵活地控制命令的输出和错误处理。

重定向指定字段

在Shell脚本中,你可以使用awksed或其他文本处理工具来指定输出字段

  1. 使用awk指定输出字段:

    awk是一个功能强大的文本处理工具,可以用于在文本文件或命令输出中提取和操作字段。以下是一些使用awk指定输出字段的示例:

    • 提取第1个字段(默认以空格分隔):

      echo "field1 field2 field3" | awk '{print $1}'
      
    • 提取第2个字段,并使用逗号作为字段分隔符:

      echo "field1,field2,field3" | awk -F, '{print $2}'
      
    • 提取所有字段,并在每个字段之间添加制表符:

      echo "field1 field2 field3" | awk '{OFS="\t"; print $1, $2, $3}'
      
  2. 使用cut指定输出字段:

    cut命令用于从文件或命令输出中提取文本列。以下是一些使用cut指定输出字段的示例:

    • 提取第1个字段(默认以制表符分隔):

      echo -e "field1\tfield2\tfield3" | cut -f1
      
    • 提取第2个字段,并使用逗号作为字段分隔符:

      echo "field1,field2,field3" | cut -d, -f2
      
    • 提取前3个字符:

      echo "field1 field2 field3" | cut -c1-3
      

这些示例仅涉及awkcut命令的基本用法。你可以根据需要调整这些命令以满足你的需求。通过使用这些工具,你可以灵活地指定输出字段并将其重定向到文件或其他命令。

应用方向

在Shell脚本中,重定向是一种将命令的输出(标准输出和/或标准错误)发送到文件、设备或其他命令的操作

  1. 日志记录:将脚本的输出和错误信息重定向到日志文件,以便于跟踪和调试。例如:

    ./my_script.sh > /path/to/output.log 2> /path/to/error.log
    

    或者,将标准输出和标准错误重定向到同一个日志文件:

    ./my_script.sh > /path/to/logfile.log 2>&1
    
  2. 数据存储:将命令的输出保存到文件中,以便于后续处理或分析。例如,将ls命令的输出保存到一个文本文件中:

    ls > file_list.txt
    
  3. 数据处理:将一个命令的输出作为另一个命令的输入,进行数据处理。例如,使用grep过滤ls命令的输出:

    ls | grep "txt"
    
  4. 输出抑制:将命令的输出重定向到/dev/null,以抑制不需要的输出。例如,运行一个产生大量输出的命令,但不希望看到输出:

    ./my_script.sh > /dev/null 2>&1
    
  5. 输入重定向:将文件的内容作为命令的输入。例如,使用cat命令显示文件内容:

    cat < file.txt
    
  6. 错误处理:将错误信息重定向到标准输出,以便于统一处理。例如:

    ./my_script.sh 2>&1 | tee error.log
    
  7. 并行执行:将多个命令的输出重定向到不同的文件,以便于并行执行和监控。例如:

    command1 > output1.txt 2> error1.txt &
    command2 > output2.txt 2> error2.txt &
    wait
    

这些只是Shell脚本中重定向的一些应用场景。实际上,重定向是一种非常强大的技术,可以帮助你更有效地控制和管理命令的输出和错误处理。

案例讲解

重定向输出时实现文件名动态生成

在Shell脚本中,你可以使用变量和命令替换来动态生成文件名,然后将输出重定向到这些文件

  1. 使用变量:

    在脚本中定义一个变量,该变量包含文件名的一部分或全部。然后,在重定向输出时使用该变量。

    # 定义一个包含日期的变量
    date_str=$(date +%Y-%m-%d)# 使用变量将输出重定向到动态生成的文件
    echo "Hello, World!" > "/path/to/logs/log_$date_str.txt"
    

    在这个示例中,我们使用date命令生成一个包含当前日期的字符串,并将其存储在变量date_str中。然后,我们将输出重定向到一个包含该日期的文件名。

  2. 使用命令替换:

    你可以使用命令替换($(command)`command`)在重定向输出时动态生成文件名。

    # 使用命令替换将输出重定向到动态生成的文件
    echo "Hello, World!" > "/path/to/logs/log_$(date +%Y-%m-%d).txt"
    

    在这个示例中,我们使用$(date +%Y-%m-%d)命令替换在重定向输出时动态生成文件名。

这些方法可以帮助你在Shell脚本中实现文件名的动态生成,并将输出重定向到这些文件。通过使用变量和命令替换,你可以根据需要灵活地生成文件名。

重定向输出时实现文件持久化

在Shell脚本中,将输出重定向到文件可以实现文件的持久化

  1. 将标准输出重定向到文件:

    使用>将命令的标准输出重定向到文件。如果文件已存在,它将被覆盖。例如:

    echo "Hello, World!" > output.txt
    

    使用>>将命令的标准输出追加到文件。如果文件不存在,它将被创建。例如:

    echo "Hello, again!" >> output.txt
    
  2. 将标准错误重定向到文件:

    使用2>将命令的标准错误重定向到文件。例如:

    command_that_produces_error 2> error.txt
    

    使用2>>将命令的标准错误追加到文件。例如:

    command_that_produces_error 2>> error.txt
    
  3. 将标准输出和标准错误重定向到同一个文件:

    使用&>将命令的标准输出和标准错误重定向到同一个文件。例如:

    command_that_produces_output_and_error &> output_and_error.txt
    

    或者,你可以分别重定向标准输出和标准错误,然后使用>>将它们追加到同一个文件:

    { command_that_produces_output_and_error 2>&1; } >> output_and_error.txt
    

通过使用这些重定向方法,你可以确保命令的输出被持久化到文件中,即使在脚本执行完成后,这些输出仍然可以访问。这对于记录日志、保存配置信息、收集统计信息等场景非常有用。

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

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

相关文章

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内&#xff0c;主机之间具有相同的网络号&#xff0c;但是必须有不同的主机号 互联网中的每一台主机&#xff0c;都要隶属于某一个子网 -&…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MySQL数据库设计

数据库设计 数据库是用来存在数据的&#xff0c;需要设计合理的数据表来存放数据–能够完成数据的存储&#xff0c;同时能够方便的提取应该系统所需的数据 1. 数据库的设计流程 数据库是为应用系统服务的&#xff0c;数据库的数据存储也是由应用系统决定的 当我们进行应用系统开…

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图

目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy ​编辑 3.使用DataFrame ​编辑 二、绘制条形图&#xff08;柱状图&#xff09; 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 ​编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…

logback 初探学习

logback 三大模块 记录器&#xff08;Logger&#xff09;、追加器&#xff08;Appender&#xff09;和布局&#xff08;Layout&#xff09; 配置文件外层最基本的标签如图示 xml中定义的就是这个三个东西下面进入学习 包引入参考springboot 官方文档 Logging :: Spring Boo…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

《图像梯度与常见算子全解析:原理、用法及效果展示》

简介:本文深入探讨图像梯度相关知识&#xff0c;详细介绍图像梯度是像素灰度值在不同方向的变化速度&#xff0c;并以 “pig.JPG” 图像为例&#xff0c;通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…

A045-基于spring boot的个人博客系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现

一、编码问题 在计算机编程中&#xff0c;流&#xff08;Stream&#xff09;是一种抽象的概念&#xff0c;用于表示数据的输入或输出。根据处理数据的不同方式&#xff0c;流可以分为字节流&#xff08;Byte Stream&#xff09;和字符流&#xff08;Character Stream&#xff0…

Python爬虫项目 | 二、每日天气预报

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果1.3.1 编辑器内打印显示效果实际应用效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 获取天气预报信息2.2.2 获取当天日期信息&#xff0c;格式化输出2.2.3 调用函数&#xff0c;输出结果 2.3 过程展示 3 总结 1…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

文章目录 1、前言2、在UG NX中创建平面和一个长方体,3、在UI Styler中创建一个UI界面4、在VS中创建一个工程4.1 创建并添加工程文件4.2 在Update_cb方法中添加选择平面的代码4.3 编译完成并测试效果1、前言 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的…

【软考】数据库

1. 数据模型 1.1 概念数据模型 概念数据模型一般用 E-R 图表示&#xff0c;常用术语如下&#xff1a; 实体&#xff1a;客观存在的事物&#xff0c;如&#xff1a;一个单位、一个职工、一个部门、一个项目。属性&#xff1a;学生实体有学号、姓名、出生日期等属性。码&#…

【强化学习的数学原理】第04课-值迭代与策略迭代-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、值迭代算法二、策略迭代算法三、截断策略迭代算法四、本节课内容summary 一、值迭代算法 值迭代算法主要包括两部分。 第一…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

Spring Boot3远程调用工具RestClient

Spring Boot3.2之后web模块提供了一个新的远程调用工具RestClient&#xff0c;它的使用比RestTemplate方便&#xff0c;开箱即用&#xff0c;不需要单独注入到容器之中&#xff0c;友好的rest风格调用。下面简单的介绍一下该工具的使用。 一、写几个rest风格测试接口 RestCont…

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…