在 bash 中用其内容替换“源文件”并扩展变量

2023-12-29

在 script.sh 中,

source a.sh
source b.sh

CMD1
CMD2
CMD3

我怎样才能更换source *.sh及其内容(不执行命令)? 我想看看 bash 解释器在获取文件并扩展所有变量后执行什么。

我知道我可以使用set -n -v or run bash -n -v script.sh 2>output.sh,但这不会取代源命令(如果 a.sh 或 b.sh 包含变量,则更少)。

我想过使用子 shell,但这仍然不能扩展源代码行。我尝试了以下组合set +n +v and set -n -v在源代码行之前和之后,但这仍然不起作用。

我将使用 ssh 将该输出发送到远程计算机。 我可以用<<output.sh将内容通过管道传输到 ssh 命令中,但我无法以 root 身份登录到远程计算机,但我是 sudoer。 因此,我认为我可以创建脚本并将其作为 base64 编码的字符串发送(使用那个聪明的把戏 https://serverfault.com/questions/625641/how-can-i-run-arbitrarily-complex-command-using-sudo-over-ssh ) base64 script | ssh remotehost 'base64 -d | sudo bash'

有解决办法吗? 或者你有更好的主意吗?


你可以这样做:

内联.sh:

#!/usr/bin/env bash
while read line; do
    if [[ "$line" =~ (\.|source)\s+.+ ]]; then
        file="$(echo $line | cut -d' ' -f2)"
        echo "$(cat $file)"
    else
      echo "$line"
    fi
done < "$1"

请注意,这假设sourced 文件存在,并且不处理错误。您还应该处理可能的 hashbang。如果sourced文件包含自身source,您需要递归地应用脚本,例如类似(未测试):

while egrep -q '^(source|\.)' main.sh; do
    bash inline.sh main.sh > main.sh
done

我们来测试一下

main.sh:

source a.sh
. b.sh

echo cc
echo "$var_a $var_b"

a.sh:

echo aa
var_a="stack" 

b.sh:

echo bb
var_b="overflow"

Result:

bash inline.sh main.sh

echo aa
var_a="stack"
echo bb
var_b="overflow"

echo cc
echo "$var_a $var_b"

bash inline.sh main.sh | bash

aa
bb
cc
stack overflow

顺便说一句,如果你只是想看看 bash 执行了什么,你可以运行

bash -x [script]

或远程

ssh user@host -t "bash -x [script]"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 bash 中用其内容替换“源文件”并扩展变量 的相关文章

  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • 如何显示 zsh 函数定义(如 bash“type myfunc”)?

    如何在 zsh 中显示函数的定义 type foo没有给出定义 在bash中 bash function foo echo hello bash foo hello bash type foo foo is a function foo e
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • 使用 sed 删除非字母数字字符

    我正在尝试验证一些输入以删除一组字符 只允许使用字母数字字符加 句点 下划线 连字符 我测试了正则表达式 w here http gskinner com RegExr http gskinner com RegExr 它与我想要删除的内容
  • 如何在 sed 中转义方括号[重复]

    这个问题在这里已经有答案了 我正在使用 grep 和 sed 解析遗留的 C 代码 当尝试替换方括号时 发生了一些奇怪的事情 以下代码替换方括号效果很好 echo xyx xzx xyx sed s g 结果是 xyx xzx xyx 当我
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • bash 中 :-(冒号破折号)的用法

    bash中这种风格的含义是什么 PUBLIC INTERFACE eth0 目的是什么 If PUBLIC INTERFACE存在且不为null 则返回其值 否则返回 eth0 实际上有一些记录在bash 手册页 http linux di
  • 如何制作一个 bash 脚本来同时创建 40 个程序实例?

    我是新来的bash and Linux 我编写了一个程序 我想创建多个同时实例 现在 我通过打开 10 个新终端 然后运行该程序 10 次 我运行的命令是php home calculatedata php 使用 bash 脚本执行此操作的
  • bash 行长度限制从何而来?

    在运行 Bash 4 4 19 标准安装 的 Solaris 11 上 输入行似乎有 256 个字符的限制 我想了解这个限制从何而来 我浏览了手册页 但没有找到任何解决此问题的内容 仅当未使用 readline 库时才会发生这种情况 在下面
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • 在bash脚本中分割字符串[重复]

    这个问题在这里已经有答案了 我想分割一个字符串并需要其中的一些参数 USER dn uid dfl3030 cn users cn accounts dc tenant dc ycs dc io cn Reb Lena Schmidt kr
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • AngularJS - 设置下拉列表的选定值不起作用

    我在这里复制了我的问题 http jsfiddle net U3pVM 2840 http jsfiddle net U3pVM 2840 正如标题所示 我无法设置使用 ng options 填充的选择的选定值 我已经搜索并尝试了我找到的所

随机推荐

  • 从实体框架类获取默认sql值

    我使用的是 T4 模板 对中提出的模板稍加修改this https stackoverflow com a 15936878 1641172答案是从我的 EF POCO 生成打字稿接口 EF Core POCO 首先生成数据库 并且某些数据
  • React TestUtils,如何模拟文档mouseMove?

    我想用TestUtils Simulate mouseMove on the document 我有一个组件Dragger这增加了一个mouseMove事件侦听器document 这是一个不完整的版本 Dragger js use stri
  • 从 readr::read_csv 中读取的数据中删除属性

    readr read csv添加编辑数据时不会更新的属性 例如 library tidyverse df lt read csv A B C na 1 x nb 1 y nc 1 z Remove columns with only one
  • LiveCharts WPF 中单独着色的数据点

    我正在使用 Live Charts WPF 来绘制一些图表 为了使每个栏具有不同的颜色 我添加了多个系列 但它没有显示x axis所有系列的标签 为什么 senderChart Series new SeriesCollection int
  • 如何在 Java 中将布尔数组转换为二进制数组,反之亦然?

    在 Java 中将布尔数组输出到文件 以及从文件输入 的最有效方法是什么 我打算使用一个字符串 每个字符要么是 t 要么是 f 然后我想 为什么不减少八倍的空间呢 NOTE 我实际上不知道哪个答案是更好的方法 我只是选择了彼得的 因为我理解
  • 使用 Clips 专家系统中的 Python 函数

    使用 PyClips 我尝试在 Clips 中构建规则 从 Python 解释器动态检索数据 为此 我注册了一个外部函数 如下所示手册 http pyclips sourceforge net manual pyclips overview
  • 在 Razor 视图中渲染 Telerik MVC Grid 时出现问题

    我在 内容 页面中有以下标记 如果没有 Render 调用 则不会呈现任何内容 而使用 Render 调用时 网格将呈现为整个页面中的第一个元素 而不是在我的视图定义的 内容 部分内 using Telerik Web Mvc UI mod
  • 从 BroadcastReceiver 调用活动方法。是否可以?

    我陷入了开发应用程序的困境 因为我需要在触发 BroadcastReceiver 时调用我的活动的方法 我希望 BroadcastReceiver 能够检测到网络连接何时断开并调用我已经编写的活动方法 我一直在搜索 发现以前有更多人问过这个
  • Android 作为 SIP 转 GSM 网关

    很快我就可以使用 SIP 转 GSM 网关 因为我需要从德国向捷克共和国的手机拨打电话 因此 我考虑实施一个 现在 问题是 这样的解决方案是否已经存在 价格合理 是否可以使用可用的 Android API SDK 或 NDK 将 语音 流重
  • itextsharp 使用签名哈希签名 pdf

    我正在尝试通过签名服务签署 pdf 此服务需要发送十六进制编码的 SHA256 摘要 作为回报 我收到十六进制编码的签名值 除此之外 我还收到签名证书 中间证书 OCSP 响应和 TimeStampToken 但是 我已经在尝试使用签名值对
  • 我可以在网站提供的页面中包含本地驱动器中的 CSS 样式表吗

    我的目标是拥有一个由网站提供的页面 其中包含样式表 该样式表不在该网站上可用 也不在其他网站上可用 而是在本地驱动器上可用 就像是 我最初的研究表明浏览器似乎不支持这一点 但我愿意被证明是错误的 或者发现一些偷偷摸摸的方法 上面的方法我都试
  • 在 Android 上将数据库备份到 SDCard

    我使用下面的代码将备份副本写入 SDCard 我得到 java io IOException Parent directory of file is not writable sdcard mydbfile db private class
  • Apache Olinge OData 服务:EdmSimpleTypeException

    当我尝试通过 OData 访问某些实体时 我收到了 EdmSimpleTypeExceptions 我正在使用 Apache Olingo 来执行此操作 问题是我无法实现除整数和字符串之外的任何类型 如果我使用 double 我会得到 Ed
  • 为接受接口的函数传递结构

    我有以下代码 package main type MyInterface interface Test type MyType struct func m MyType Test func AcceptInterface i MyInter
  • 使用 DbContext Set() 而不是在上下文上公开

    执行以下操作时是否存在任何差异 public class UsersContext DbContext public DbSet
  • 通用迭代器

    我正在尝试找到一种访问一组容器的通用方法 除了另一个自定义列表之外 我还有一个标准向量和列表 自定义列表定义了一个迭代器 class Iterator public std iterator
  • JPA完全动态和多级标准API

    我正在尝试了解如何创建一个 JPA Criteria 查询 该查询允许进行多个级别的完全动态过滤 例如 select from table where column1 A and column2 B or column3 C or colu
  • IN(以及 INS、INSB 等)指令可以在 x86 汇编中块吗?

    当尝试从 x86 特别是 Pentium 上的 I O 端口读取数据时 IN 系列指令在等待数据时是否会阻塞 还是总是立即返回 据我所知 x86 系列处理器上只有一条 阻塞 指令 HLT IN 和 OUT 及其变体 只不过是对内存的读 写访
  • 基于java脚本中嵌套对象数组中的键对列表进行排序的最佳方法

    我有以下内容 var list item a 5 a1 6 a2 7 b 3 b1 4 b2 2 item a 1 a1 2 a2 3 b 4 b1 5 b2 6 item a 2 a1 7 a2 4 b 3 b1 7 b2 1 假设我有变
  • 在 bash 中用其内容替换“源文件”并扩展变量

    在 script sh 中 source a sh source b sh CMD1 CMD2 CMD3 我怎样才能更换source sh及其内容 不执行命令 我想看看 bash 解释器在获取文件并扩展所有变量后执行什么 我知道我可以使用s