私のスクリプトは外部ファイルをたくさん使用します。
ところで問題があります。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
使いたいです。次は可能ですが、あまり良くありません。var1
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.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
答え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
そうでない場合は調整が必要な場合があります