如何以非交互方式将参数传递给交互式脚本

news2024/11/16 23:57:05

文章目录

    • 问题
    • 回答
      • 1. 使用 Here Document
      • 2. 使用 echo 管道传递
      • 3. 使用文件描述符
      • 4. 使用 expect 工具
    • 参考

问题

我有一个 Bash 脚本,它使用 read 命令以交互方式读取命令参数,例如 yes/no 选项。是否有一种方法可以在非交互式脚本中调用这个脚本,并将默认选项值作为参数传递?

我不止需要向交互式脚本传递一个选项。

回答

如果你的脚本是通过 read 命令在交互式环境下读取命令参数,并且你希望在非交互式脚本中传递参数,那么你可以使用以下几种方法来模拟交互式输入:

1. 使用 Here Document

Here Document 可以用来传递多行输入到脚本:

bash your-interactive-script.sh <<EOF
answer1
answer2
answer3
EOF

其中 answer1, answer2, 和 answer3 是对应于脚本中每一个 read 提示的输入。

2. 使用 echo 管道传递

可以通过 echo 命令和管道来传递输入值:

echo -e "answer1\nanswer2\nanswer3" | bash your-interactive-script.sh

在这里,-e 会启用对反斜杠转义的解释,\n 用于模仿输入键(ENTER)的效果。

3. 使用文件描述符

还可以使用文件描述符来模拟交互式输入:

exec 3< <(echo -e "answer1\nanswer2\nanswer3")
./your-interactive-script.sh <&3
exec 3<&-

在这里,打开了一个文件描述符 3,并将其与提供输入的进程替换关联起来。你的脚本从该文件描述符中读取内容,而不是从标准输入(stdin)中读取。
最后使用命令 exec 3<&- 关闭这个文件描述符,这样可以防止资源泄露,并确保这个文件描述符可以在脚本或程序的后续部分重新使用。

在 Bash 脚本中,exec 命令用于执行命令并在当前 shell 环境中改变 shell 的行为。文件描述符是用于访问文件和流的小的、非负整数。常见的文件描述符包括 0(标准输入 stdin)、1(标准输出 stdout)和 2(标准错误 stderr)。

下面是这条命令的一部分解释:

  • exec 3< ...:这个命令会打开一个文件或者创建一个输入流,并将它分配给文件描述符 3。当你读取文件描述符 3 时,你实际上会从这个文件或流中读取数据。

  • <&-:这是用来关闭文件描述符的语法。具体到 exec 3<&-,这条命令会关闭之前分配给文件描述符 3 的文件或流。

总的来说,exec 3< <(command) 会创建一个新的文件描述符 3,并从 command 命令产生的输出中读取数据。当你完成使用这个文件描述符后,使用 exec 3<&- 就可以关闭这个文件描述符,这样可以防止资源泄露,并确保这个文件描述符可以在脚本或程序的后续部分重新使用。

测试截图:

4. 使用 expect 工具

对于需要等待特定提示或需要更多控制的复杂场景,可以使用 expect 工具:

#!/usr/bin/expect -f

spawn ./your-interactive-script.sh
expect "第一次提示"
send "answer1\r"
expect "第二次提示"
send "answer2\r"
expect "第三次提示"
send "answer3\r"
interact

你可以用以下命令来安装 expect

sudo apt-get install expect  # Debian/Ubuntu 系统

或者

sudo yum install expect      # CentOS/RHEL 系统

根据你的脚本输入场景的复杂程度来选择最合适的方法。如果只是一系列简单的输入,方法 1 和 2 可能是最简便的。但是,如果脚本需要更复杂的交互,expect 可能更合适。

#!/usr/bin/expect -f

spawn ./interactive-script.sh
expect "name"
send "Bob\r"
expect "age"
send "17\r"
interact

测试截图:

总之,根据你的脚本输入场景的复杂程度来选择最合适的方法。如果只是一系列简单的输入,方法 1 和 2 是最简便的。但是,如果脚本需要更复杂的交互,expect 更合适。


参考

  • stackoverflow question 14392525
  • Here-Documents
  • man expect

相关阅读:

  • sh和Bash的区别
  • 2>&1是什么意思
  • 如何使用bash脚本并行运行多个程序
  • 为什么要使用xargs命令
  • 在shell程序里如何从文件中获取第n行
  • 如何用命令行将文本每两行合并为一行?

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

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

相关文章

粘性代理 vs 轮换代理: 特点、优势与选择指南

在网络领域&#xff0c;代理服务器是一种常见的工具&#xff0c;用于隐藏真实IP地址并提供更安全和匿名的网络体验。 粘性代理和轮换代理是两种常见的代理类型&#xff0c;它们在IP持久性和变更频率等方面有所不同。 本文将介绍粘性代理和轮换代理的区别&#xff0c;并分析在…

1.Linux入门

文章目录 一、介绍1.1 操作系统1.2 Linux1.3 虚拟机1.4 安装 CentOS7 二、远程连接 Linux2.1 FinalShell2.2 远程连接Linux 三、扩展3.1 WSL3.2 虚拟机快照 一、介绍 1.1 操作系统 我们平常所用的电脑是个人桌面操作系统&#xff0c;也就是Windows或者是macOS 目前我们要学的…

npm彻底清理缓存

在使用npm过程中&#xff0c;肯定会遇到清缓存的情况&#xff0c;网上的命令一般为 npm cache clear --force有时笔者在清理缓存之后npm install依然失败&#xff0c;仔细发现&#xff0c;执行该命令之后npm报了一个警告 npm WARN using --force Recommended protections dis…

使用AppJail配置网络并创建tiny jail(未成功)

创建tiny jail成功了&#xff0c;但是网络配置这块&#xff0c;jail里只能ping通外面&#xff0c;而无法pkg更新软件。本文章是这篇文章Jail管理器AppJail的使用FreeBSD-CSDN博客的网络篇。 首先host主机配置pf防火墙 参考这里&#xff1a;Packet Filter - AppJail Handbook …

[经验] 羊肺怎么清洗才干净视频 #经验分享#学习方法#其他

羊肺怎么清洗才干净视频 1、羊肺怎么清洗才干净 羊肺是一种营养丰富的食材&#xff0c;含有丰富的蛋白质和维生素&#xff0c;是众多美食菜谱的重要原料之一。但是&#xff0c;由于羊肺的内部结构复杂&#xff0c;清洗起来比较麻烦。那么&#xff0c;如何清洗羊肺才能让它干净…

基于Python的Selenium详细教程

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…

在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

0、引言 ⚠️ 在开始之前&#xff0c;您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好&#xff0c;可以参考这篇文章 本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目&#xff08;工作空间&#xff09;。 1、本教程使用到的相关软件或产品 Ubuntu 20.0…

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

【Python报错】已解决Attributeerror: ‘list‘ object has no attribute ‘join‘( Solved)

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘join’ (Solved) 在Python中&#xff0c;字符串&#xff08;str&#xff09;对象有一个非常有用的join()方法&#xff0c;它允许你将序列中的元素连接&#xff08;join&#xff09;成一个字符串…

动态规划学习(混合背包,有依赖的背包,以及背包思想)

混合背包的定义&#xff1a; 混合背包问题就是混合01背包、完全背包和多重背包&#xff0c;可供选择的物体i可能有一个、或者无数个、或者有限个。 所以&#xff0c;就不要考虑这么多了&#xff0c;直接分这三种情况考虑就行&#xff01;&#xff01; 样例&#xff1a; for(…

优化财务管理制度提升企业经营效益—以审计代理记账为例

随着社会经济的快速发展&#xff0c;企业经营规模不断扩大&#xff0c;面临的财务管理问题也日益复杂&#xff0c;而作为其中的重要一环&#xff0c;审计代理记账已经成为了企业的必要组成部分&#xff0c;本文将重点探讨审计代理记账对于优化企业财务管理&#xff0c;提高经营…

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

Linux 中常用的设置、工具和操作

1.设置固定的ip地址步骤 1.1 添加IPADDR“所设置的固定ip地址” TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROUTE"yes" IPV4_FAILURE_FATAL"no" IPV6INIT"yes" IPV6…

Vue——模板引用(不建议使用,了解)

文章目录 前言测试案例 前言 模板引用&#xff0c;在官方文档中也有很详细的描述。 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层 DOM 元素。 个人理解为&#xff1a; 在vue中&#xff0c;依据…

gcc与g++的原理

程序的翻译 1 快速认识gcc/g2 程序翻译的过程2.1 预处理阶段2.2 编译阶段2.3 汇编阶段2.4 链接阶段 3 动静态库 1 快速认识gcc/g 首先我们需要在linux系统中安装对应的编译器gcc/g&#xff0c;安装命令如下&#xff08;centos7环境下&#xff09;&#xff1a; gcc: yum instal…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139424086 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子网络科技博…

centos安装vscode的教程

centos安装vscode的教程 步骤一&#xff1a;打开vscode官网找到历史版本 历史版本链接 步骤二&#xff1a;找到文件下载的位置 在命令行中输入&#xff08;稍等片刻即可打开&#xff09;&#xff1a; /usr/share/code/bin/code关闭vscode后&#xff0c;可在应用程序----编程…

Matplotlib常见图汇总

Matplotlib是python的一个画图库&#xff0c;便于数据可视化。 安装命令 pip install matplotlib 常用命令&#xff1a; 绘制直线&#xff0c;连接两个点 import matplotlib.pyplot as plt plt.plot([0,5],[2,4]) plt.show() 运行结果如下&#xff1a; 多条线&#xff1a;…