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

.exitmain.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그렇지 않은 경우 조정해야 할 수도 있습니다

관련 정보