내 스크립트에서는 외부 파일을 많이 사용합니다.
그런데 문제가 있습니다. 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
그렇지 않은 경우 조정해야 할 수도 있습니다