bash 源 script.sh 并退出 0

bash 源 script.sh 并退出 0

我在脚本中使用了很多外部文件。

但我有一个问题,如果我将文件exit内容作为源文件,脚本将退出加载,并且我想要使用的字符串就会消失。

例子main.sh

#!/bin/bash

clear;
source /opt/external-svn/config.sh;
echo "$var1 and $var2 and $var3";

例子config.sh

#!/bin/bash

var1="foo bar is great"
var2="foooo baar is greater"
var3="foooooooo baaaaaar is \
to long"

exit 0

问题是多行var3,所以我想使用var1and的源代码var2。以下是可能的,但不太好:

var1=$(cat "/opt/external-svn/config.sh" |awk -F'"' '/^var1/ {print $2}');

这仅适用于单行,不适用于var3.

有一个简单/容易的解决方案吗?

更新,因为我太蠢了,无法做出正确的答案

@Gilles 没有在原始文件中工作,在这里寻求建议 raw.githubusercontent.com/gorgone/temptest/master/config.sh

#!/bin/bash

FILE="/tmp/$(basename $0).$$.tmp"
configsh="/opt/external-svn/config.sh"
grep -vE '^exit' $configsh > $TFILE
source "$TFILE"

退出主脚本并在屏幕上显示回显

@Anthon 它也不适用于我在 github 上的文件

Update2找到解决方案

我发现了一个神奇的方法,我使用了这个想法,但它不是一个通用的解决方案

只针对我的特殊情况

cat config.sh |sed 's/if [ $# = 0 ]/if [ $# = 1 ]/g' >config.source

这样我就可以获取该文件的来源

但最好的方法是为所有文件提供通用解决方案

答案1

您可以通过在 的开头声明自定义函数来覆盖exit您的.main.shexitmain.sh

#!/bin/bash
# main.sh
exit() { 
   local exit_code="${1-?}"
   test "$exit_code" -ne 0 && builtin exit "$exit_code"
   :
}
clear;
source /opt/external-svn/config.sh;
echo "$var1 and $var2 and $var3";

#unset -f exit; exit 0
builtin exit 0

答案2

如果你有abc.inc

x=1
exit 0

klm.inc

y=2
exit 0

那么如果你有combine脚本:

#!/bin/bash

for fn in abc klm; do
  grep -vE '^exit' $fn.inc > /tmp/xyz.tmp
  source /tmp/xyz.tmp
done

echo x: $x
echo y: $y

您可以运行combine并获取输出:

x: 1
y: 2

这假设您的exit语句位于其行的开头,grep如果不是,您可能需要调整

相关内容