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使いたいです。次は可能ですが、あまり良くありません。var1var2

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そうでない場合は調整が必要な場合があります

関連情報