bash - 在 bash 中用其内容替换 'source file' 并扩展变量

标签 bash set expansion subshell

在 script.sh 中,

source a.sh
source b.sh

CMD1
CMD2
CMD3

如何替换 source *.sh他们的内容(不执行命令)? 我想看看 bash 解释器在获取文件和展开所有变量后执行了什么。

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

我考虑过使用子 shell,但仍然无法扩展源代码行。我尝试了 set +n +v 的组合和 set -n -v在源代码行之前和之后,但这仍然不起作用。

我将使用 ssh 将该输出发送到远程机器。 我可以使用 <<output.sh将内容通过管道传输到 ssh 命令,但我无法以 root 身份登录到远程计算机,但我是一个 sudoer。 因此,我想我可以创建脚本并将其作为 base64 编码的字符串发送(使用 that clever trick ) 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 文件存在,并且不处理错误。您还应该处理可能的 hashbangs。如果 source 文件本身包含 source,则需要递归地应用脚本,例如类似(未测试):

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

让我们测试一下

主.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"

结果:

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]"

关于bash - 在 bash 中用其内容替换 'source file' 并扩展变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531927/

相关文章:

bash - 计算字符串中的点数

Bash 参数扩展

regex - 将类似正则表达式的表示法扩展到多个文字

android - 测试APK扩展库的问题

json - 使用 bash 找到匹配的字符串键并在 json 文件中增加其值

bash - 循环两组文件

java-8 - Java 流收集器对给定流进行排序

kotlin - 在 Kotlin 中,HashSet 包含通过哈希重复的元素

python - 在Python中查找列表中的元素集而不进行排序

json - 如何将 XML 文件转换为 JSON 文件