shell脚本(完)—脚本互调重定向的学习
免责声明
学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。
笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
脚本互调
在Shell脚本中,脚本互调是指在一个脚本中调用另一个脚本
-
使用
bash或sh命令调用另一个脚本:
#!/bin/bash
# script1.sh# 调用script2.sh
bash script2.sh
-
使用
source或.命令调用另一个脚本:
#!/bin/bash
# script1.sh# 调用script2.sh
source script2.sh
# 或者
. script2.sh
这两种方法有一些区别:
-
使用
bash或sh命令调用另一个脚本时,会创建一个新的子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.sh在script1.sh中成功执行,并且变量和函数可以在两个脚本之间共享。
确保在shell脚本中调用外部脚本的权限
在Shell脚本中调用外部脚本时,确保调用方具有适当的权限是很重要的
-
确保脚本具有可执行权限。你可以使用
chmod命令为脚本添加可执行权限:
chmod +x /path/to/script2.sh
-
如果脚本需要特定的用户权限(例如,root权限),请确保以适当的用户身份运行脚本。你可以使用
sudo命令以其他用户身份(通常是root)运行脚本:
sudo /path/to/script2.sh
-
如果脚本位于受保护的目录中,确保调用方有权限访问该目录。你可以更改目录权限或更改目录所有者以实现这一点。
-
如果脚本依赖于其他文件或资源,请确保调用方有权限访问这些资源。
-
在脚本中添加错误处理,以便在调用外部脚本时捕获和处理错误。例如:
#!/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)功能
-
使用反引号(`):
#!/bin/bash
# script1.sh# 调用外部脚本script2.sh并捕获其输出
output=`/path/to/script2.sh`# 打印捕获到的输出
echo "Output from script2.sh: $output"
-
使用$():
#!/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脚本中,脚本互调是指在一个脚本中调用另一个脚本,这在实际应用中非常常见
-
模块化:将脚本的功能划分为多个独立的脚本文件,以便于管理和维护。这样可以使每个脚本专注于一个特定的任务,提高代码的可读性和可重用性。
例如,你可以创建一个名为
utility.sh的脚本,其中包含一些通用的函数和实用程序,然后在其他脚本中通过source或.命令调用它。 -
配置管理:在一个脚本中调用另一个脚本以获取配置信息。例如,你可以创建一个名为
config.sh的脚本,其中包含一些环境变量和配置参数,然后在主脚本中调用它以获取这些值。 -
任务分解:将一个复杂的任务分解为多个子任务,并为每个子任务创建一个单独的脚本。然后,在主脚本中按顺序调用这些子任务脚本。
例如,你可以创建一个名为
backup.sh的脚本,用于执行数据备份任务。在这个脚本中,你可以调用其他脚本,如clean.sh(用于清理旧数据)、compress.sh(用于压缩数据)和transfer.sh(用于将数据传输到远程服务器)。 -
代码复用:在一个脚本中调用另一个脚本以重用已有的代码。这可以避免重复编写相同的代码,提高开发效率。
例如,你可以创建一个名为
logging.sh的脚本,其中包含一些用于记录日志的函数,然后在其他脚本中通过source或.命令调用它。 -
并行执行:在一个脚本中调用多个脚本,并行执行它们以提高性能。这可以通过使用
&符号将脚本放入后台执行,并使用wait命令等待它们完成。例如,你可以创建一个名为
parallel_tasks.sh的脚本,在其中调用task1.sh、task2.sh和task3.sh,并使用&符号将它们放入后台执行。然后,使用wait命令等待所有任务完成。
这些只是脚本互调的一些应用场景。实际上,脚本互调是一种非常灵活的技术,可以帮助你更有效地编写和管理Shell脚本。
重定向
在Shell脚本中,重定向是一种将命令的输出(标准输出和/或标准错误)发送到文件、设备或其他命令的操作
-
将标准输出重定向到文件:
使用
>将命令的标准输出重定向到文件。如果文件已存在,它将被覆盖。例如:echo "Hello, World!" > output.txt使用
>>将命令的标准输出追加到文件。如果文件不存在,它将被创建。例如:echo "Hello, again!" >> output.txt -
将标准错误重定向到文件:
使用
2>将命令的标准错误重定向到文件。例如:command_that_produces_error 2> error.txt使用
2>>将命令的标准错误追加到文件。例如:command_that_produces_error 2>> error.txt -
将标准输出和标准错误重定向到同一个文件:
使用
&>将命令的标准输出和标准错误重定向到同一个文件。例如:command_that_produces_output_and_error &> output_and_error.txt或者,你可以分别重定向标准输出和标准错误,然后使用
>>将它们追加到同一个文件:{ command_that_produces_output_and_error 2>&1; } >> output_and_error.txt -
将标准输出和/或标准错误重定向到其他命令:
使用管道(
|)将一个命令的标准输出重定向到另一个命令的标准输入。例如:ls | grep "txt"使用
2>&1将标准错误重定向到标准输出,然后将其传递给另一个命令。例如:command_that_produces_error 2>&1 | grep "error"
这些是Shell脚本中常用的重定向方法。通过使用这些方法,你可以灵活地控制命令的输出和错误处理。
重定向指定字段
在Shell脚本中,你可以使用awk、sed或其他文本处理工具来指定输出字段
-
使用
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}'
-
-
使用
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
-
这些示例仅涉及awk和cut命令的基本用法。你可以根据需要调整这些命令以满足你的需求。通过使用这些工具,你可以灵活地指定输出字段并将其重定向到文件或其他命令。
应用方向
在Shell脚本中,重定向是一种将命令的输出(标准输出和/或标准错误)发送到文件、设备或其他命令的操作
-
日志记录:将脚本的输出和错误信息重定向到日志文件,以便于跟踪和调试。例如:
./my_script.sh > /path/to/output.log 2> /path/to/error.log或者,将标准输出和标准错误重定向到同一个日志文件:
./my_script.sh > /path/to/logfile.log 2>&1 -
数据存储:将命令的输出保存到文件中,以便于后续处理或分析。例如,将
ls命令的输出保存到一个文本文件中:ls > file_list.txt -
数据处理:将一个命令的输出作为另一个命令的输入,进行数据处理。例如,使用
grep过滤ls命令的输出:ls | grep "txt" -
输出抑制:将命令的输出重定向到
/dev/null,以抑制不需要的输出。例如,运行一个产生大量输出的命令,但不希望看到输出:./my_script.sh > /dev/null 2>&1 -
输入重定向:将文件的内容作为命令的输入。例如,使用
cat命令显示文件内容:cat < file.txt -
错误处理:将错误信息重定向到标准输出,以便于统一处理。例如:
./my_script.sh 2>&1 | tee error.log -
并行执行:将多个命令的输出重定向到不同的文件,以便于并行执行和监控。例如:
command1 > output1.txt 2> error1.txt & command2 > output2.txt 2> error2.txt & wait
这些只是Shell脚本中重定向的一些应用场景。实际上,重定向是一种非常强大的技术,可以帮助你更有效地控制和管理命令的输出和错误处理。
案例讲解
重定向输出时实现文件名动态生成
在Shell脚本中,你可以使用变量和命令替换来动态生成文件名,然后将输出重定向到这些文件
-
使用变量:
在脚本中定义一个变量,该变量包含文件名的一部分或全部。然后,在重定向输出时使用该变量。
# 定义一个包含日期的变量 date_str=$(date +%Y-%m-%d)# 使用变量将输出重定向到动态生成的文件 echo "Hello, World!" > "/path/to/logs/log_$date_str.txt"在这个示例中,我们使用
date命令生成一个包含当前日期的字符串,并将其存储在变量date_str中。然后,我们将输出重定向到一个包含该日期的文件名。 -
使用命令替换:
你可以使用命令替换(
$(command)或`command`)在重定向输出时动态生成文件名。# 使用命令替换将输出重定向到动态生成的文件 echo "Hello, World!" > "/path/to/logs/log_$(date +%Y-%m-%d).txt"在这个示例中,我们使用
$(date +%Y-%m-%d)命令替换在重定向输出时动态生成文件名。
这些方法可以帮助你在Shell脚本中实现文件名的动态生成,并将输出重定向到这些文件。通过使用变量和命令替换,你可以根据需要灵活地生成文件名。
重定向输出时实现文件持久化
在Shell脚本中,将输出重定向到文件可以实现文件的持久化
-
将标准输出重定向到文件:
使用
>将命令的标准输出重定向到文件。如果文件已存在,它将被覆盖。例如:echo "Hello, World!" > output.txt使用
>>将命令的标准输出追加到文件。如果文件不存在,它将被创建。例如:echo "Hello, again!" >> output.txt -
将标准错误重定向到文件:
使用
2>将命令的标准错误重定向到文件。例如:command_that_produces_error 2> error.txt使用
2>>将命令的标准错误追加到文件。例如:command_that_produces_error 2>> error.txt -
将标准输出和标准错误重定向到同一个文件:
使用
&>将命令的标准输出和标准错误重定向到同一个文件。例如:command_that_produces_output_and_error &> output_and_error.txt或者,你可以分别重定向标准输出和标准错误,然后使用
>>将它们追加到同一个文件:{ command_that_produces_output_and_error 2>&1; } >> output_and_error.txt
通过使用这些重定向方法,你可以确保命令的输出被持久化到文件中,即使在脚本执行完成后,这些输出仍然可以访问。这对于记录日志、保存配置信息、收集统计信息等场景非常有用。
相关文章:
shell脚本(完)—脚本互调重定向的学习
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 脚本互调 在Shell脚本中&a…...
ant-design-vue中table某一列进行合并
ant-design-vue中table某一列进行合并 1、在colums中配置自定义渲染 {title: 区域,dataIndex: cityName,key: cityName,align: center,width: 120,customCell: (record, rowIndex, column) > {return {rowSpan: record.rowSpan}} },2、处理请求来的数据 tableData.dataSo…...
基于Springboot+Vue社区养老服务管理系统(源码+lw+讲解部署+PPT)
前言 详细视频演示 论文参考 系统介绍 系统概述 核心功能 用户角色与功能 具体实现截图 1. 服务信息查看功能 主要代码实现 截图: 2. 服务申请功能 主要代码实现 截图: 3. 公告信息查看功能 主要代码实现 截图: 4. 服务信息…...
大数据调度组件之Apache DolphinScheduler
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…...
介绍一下strlwr(arr);(c基础)
hi , I am 36 适合对象c语言初学者 strlwr(arr);函数是把arr数组变为小写字母 格式 #include<string.h> strlwr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…...
meterpreter常用命令 上
Meterpreter 是 Metasploit 框架中的一个高级 Payload,广泛用于渗透测试和攻击模拟。以下是一些常用的 Meterpreter 命令: 1. 基本命令 sysinfo 显示目标系统的基本信息(操作系统、架构等)。 getuid 获取当前用户的身份信息。…...
【kubernetes】kubernetes各组件的调用关系
目录 1. 说明2. Kubernetes组件概述2.1 控制平面组件2.2 节点组件 3. Kubernetes组件调用关系4. 示例说明 1. 说明 1.Kubernetes是一个开源的容器编排工具,其各个组件之间存在着复杂的调用关系,共同构建起一个完整的容器编排系统。2.Kubernetes集群主要…...
Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
Vue.js修饰符
Vue.js 是一个渐进式JavaScript框架,用于构建用户界面。在Vue.js中,修饰符(Modifiers)是一种增强指令行为的工具,它们可以改变指令的默认行为。本文将详细讲解Vue.js中的修饰符,并提供实际示例,…...
【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)
宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…...
【含文档】基于.NET的医院医保管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 主要技术:mysql,vue 2.视频演示地址 3.功能 系统定义了两个角色:管理员和用户。 管理员进入主界面&…...
c++源码阅读__smart_ptr__正文阅读
文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…...
图形化界面MySQL(MySQL)(超级详细)
1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables;要先选中 圆圈处支持自己输入 点击这个就执…...
【2024 Optimal Control 16-745】Julia语法
Lecture 2 θ和它的导数符号是通过 Julia 中的变量命名方式实现的 变量 θ 的输入: 在 Julia 中,θ 是一个合法的变量名,就像普通的字母 x 或 y 一样。要输入 θ,可以使用以下方法: 在 Jupyter Notebook 或 Julia REP…...
Opencv+ROS实现摄像头读取处理画面信息
一、工具 ubuntu18.04 ROSopencv2 编译器:Visual Studio Code 二、原理 图像信息 ROS数据形式:sensor_msgs::Image OpenCV数据形式:cv:Mat 通过cv_bridge()函数进行ROS向opencv转换 cv_bridge是在ROS图像消息和OpenCV图像之间进行转…...
网络安全,文明上网(2)加强网络安全意识
前言 在当今这个数据驱动的时代,对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识:信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分,信息技术的快速进步使得我们对网络的依赖性日益增强。然而,网络安全…...
深度学习实战图像缺陷修复
这里写目录标题 概述1. 图像缺陷修复的研究背景2. 传统图像缺陷修复方法的局限性(1) 基于纹理合成的方法(2) 基于偏微分方程(PDE)的方法 3. 深度学习在图像缺陷修复中的兴起(1) 深度学习的基本思路(2) 深度学习方法的优势(3) 关键技术的引入 4. 深度学习…...
jenkins 2.346.1最后一个支持java8的版本搭建
1.jenkins下载 下载地址:Index of /war-stable/2.346.1 2.部署 创建目标文件夹,移动到指定位置 创建一个启动脚本,deploy.sh #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/opt/projects/jenkins # 服务名称。同时约定部…...
【数据库原理】创建与维护表,DDL数据定义语言
数据描述语言(数据定义语言) 就是管理数据库整个库,整个表,表的属性列的语句。 常用词儿就是数据库或表的增删改查:CREATE创建、DROP删除、ALTER修改、SHOW查看、USE进入表。 表的字段控制:PRIMARY KEY主键…...
驾驭Go语言中的不确定性:深入错误处理机制
驾驭Go语言中的不确定性:深入错误处理机制 在Go语言的编程世界中,错误处理是确保程序健壮性的关键。Go语言通过显式的错误返回值和panic/recover机制,提供了一套独特的错误处理策略。本文将深入探讨Go语言中的错误处理,包括原理、技术细节和实际案例,帮助读者在实际编程中…...
2026年阿里云OpenClaw/Hermes Agent配置Token Plan部署保姆级
2026年阿里云OpenClaw/Hermes Agent配置Token Plan部署保姆级。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&am…...
深入解析tsMuxer:高效无损视频封装解决方案与实战配置指南
深入解析tsMuxer:高效无损视频封装解决方案与实战配置指南 【免费下载链接】tsMuxer tsMuxer is a transport stream muxer for remuxing/muxing elementary streams, EVO/VOB/MPG, MKV/MKA, MP4/MOV, TS, M2TS to TS to M2TS. Supported video codecs H.264/AVC, H…...
如何用.NET Windows Desktop Runtime彻底解决Windows桌面应用部署难题?终极指南来了!
如何用.NET Windows Desktop Runtime彻底解决Windows桌面应用部署难题?终极指南来了! 【免费下载链接】windowsdesktop 项目地址: https://gitcode.com/gh_mirrors/wi/windowsdesktop 想象一下这样的场景:你花费数月精心开发的Window…...
DeepSeek企业版访问控制配置白皮书(内部泄露版·含审计日志埋点规范与SOC2合规映射表)
更多请点击: https://codechina.net 第一章:DeepSeek企业版访问控制配置概述 DeepSeek企业版提供细粒度、可审计、可扩展的访问控制能力,支持基于角色(RBAC)、属性(ABAC)及策略即代码ÿ…...
利用大语言模型生成可解释特征:从黑盒预测到白盒决策的工程实践
1. 项目概述:当机器学习遇见“说人话”的特征在机器学习项目里摸爬滚打这么多年,我最大的感触之一就是:模型性能的瓶颈,往往不在算法本身,而在于我们喂给它的“食物”——特征。尤其是在处理文本数据时,这个…...
终极AI换脸指南:用roop-unleashed轻松制作专业级深度伪造视频
终极AI换脸指南:用roop-unleashed轻松制作专业级深度伪造视频 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要制作电影级别的AI换脸视频&am…...
Taotoken 的用量看板如何帮助我清晰掌握每月大模型支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 的用量看板如何帮助我清晰掌握每月大模型支出 对于个人开发者或项目管理者而言,大模型 API 的调用成本常常是…...
为什么你的ChatGPT文案点赞不过50?:曝光量断层背后的3个隐藏信号+实时诊断自查表(附赠算法工程师内部校验清单)
更多请点击: https://codechina.net 第一章:为什么你的ChatGPT文案点赞不过50? 你精心打磨的ChatGPT提示词,生成了逻辑清晰、文风优雅的文案,却在社交平台仅收获47个赞——这并非内容质量的问题,而是**人机…...
Java 零基础全套教程,File 类与 IO 流,笔记 175-176
Java 零基础全套教程,File 类与 IO 流,笔记 175-182 一、参考资料 【Java视频教程,java入门神器(附300道Java面试题剖析)】 https://www.bilibili.com/video/BV1PY411e7J6/?p175&share_sourcecopy_web&vd_sou…...
CFD湍流模型不确定性量化:特征空间扰动框架原理与应用
1. 项目概述与核心挑战在计算流体力学(CFD)的工程实践中,我们常常面临一个核心困境:如何高效且可靠地预测复杂湍流?雷诺平均纳维-斯托克斯(RANS)模型因其在计算成本和工程实用性之间的绝佳平衡&…...
