在 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"
请注意,这假设source
d 文件存在,并且不处理错误。您还应该处理可能的 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(使用前将#替换为@)