bash source script.sh com saída 0

2

Eu uso muitos arquivos externos em meus scripts.

Mas eu tenho um problema, que se eu origem um arquivo com exit no conteúdo do arquivo, o script sai do carregamento e as seqüências que eu quero usar se foram .

Exemplo main.sh :

#!/bin/bash

clear;
source /opt/external-svn/config.sh;
echo "$var1 and $var2 and $var3";

Exemplo config.sh :

#!/bin/bash

var1="foo bar is great"
var2="foooo baar is greater"
var3="foooooooo baaaaaar is \
to long"

exit 0

O problema é a multilinha var3 , então eu quero usar a fonte para var1 e var2 . O seguinte é possível, mas não é bom:

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

Isso só funciona para uma única linha, não para var3 .

Existe uma solução simples / fácil?

atualizar porque sou idiota ao fazer uma resposta correta

@Gilles não não está funcionando arquivo em bruto está aqui para sugestões 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"

saia do mainscript e obtenha eco para a tela

@Anthon também não funciona para o meu arquivo no github

Update2 encontrou a solução

eu encontrei a mágica ONE Eu uso a idéia, mas não é uma solução genérica

apenas para o meu caso especial

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

para poder criar o arquivo

mas a melhor maneira é ter uma solução genérica para todos os arquivos

    
por Gorgone Impertinence 18.04.2016 / 16:03

2 respostas

2

Se você tiver abc.inc :

x=1
exit 0

e klm.inc :

y=2
exit 0

se você tiver combine script:

#!/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

você pode executar combine e obter como resultado:

x: 1
y: 2

Isso pressupõe que sua instrução exit esteja no início de suas linhas, você pode ter que ajustar o grep se eles não estiverem

    
por 18.04.2016 / 16:26
4

Você pode substituir exit no seu main.sh declarando uma função exit personalizada no início de 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
    
por 18.04.2016 / 20:37