Bash

退出 0 的 bash 源 script.sh

  • April 19, 2016

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

但是我有一個問題,如果我在文件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,所以我想使用 source for var1and var2。以下是可能的,但不是很好:

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

這僅適用於單行,不適用於var3.

有沒有簡單/容易的解決方案?

更新,因為我愚蠢地做出正確的答案

@Gilles no not working the file in raw 在這裡尋求建議 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 找到解決方案

我找到了神奇的 ONE 我使用了這個想法,但它不是一個通用的解決方案

僅適用於我的特殊情況

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

所以我可以獲取文件

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

如果您有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如果不是,您可能需要調整

您可以通過exit在.main.sh``exit``main.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

引用自:https://unix.stackexchange.com/questions/277275