Retorna um código de saída sem matar o terminal do chamador?

1

Estou com dificuldades para obter o valor de retorno de um script. O script que está me causando problemas é second.sh abaixo. Mas há uma interação presente com um script chamado first.sh , e essa interação parece ser a fonte do problema.

O primeiro script é um script de teste e direciona o segundo script. Ele precisa do segundo script para definir um ambiente de compilação cruzada (daí o motivo de um ponto inicial). O primeiro script invoca então make com várias variáveis definidas, como CXX e < em> CXXFLAGS .

# first.sh

. ./second.sh arg1
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg2
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg3
if [ "$?" -eq "0" ]; then
    make
    ...
fi

O segundo script geralmente é executado de forma independente pelo usuário, e é bastante complicado porque está detectando plataformas, arquiteturas e outros recursos diversos. Ele define várias variáveis, como CXX e CXXFLAGS usado por make no primeiro script.

# second.sh
...

# if success, return 0
exit 0
...

# if failure, return non-0
exit 1

O problema que estou tendo é a chamada para exit em second.sh mata o terminal , então first.sh é interrompido em suas trilhas. Um problema semelhante ocorre quando o usuário o executa sozinho.

Quando tento alterar o segundo script para:

# second.sh
...

# if success, return 0
return 0

# else for failure, return non-0
return 1

Em seguida, na perspectiva first.sh , second.sh sempre falha, mesmo com return 0 .

Como eu adiciono um código de retorno que não mata o terminal em Bash?

Até hoje, tenho executado sem o primeiro script de teste, portanto, o segundo script não precisa retornar sucesso / falha. Mas eu estou tentando automatizar o teste, então eu realmente preciso ser capaz de obter um código de retorno

    
por jww 09.03.2016 / 03:42

3 respostas

2

Uma maneira talvez não ideal é fazer alias exit=return , o que faz com que as second.sh exits do script retornem, com o código como dado. Isso, claro, não corta o aninhamento de funções como exit , mas deve funcionar bem para as chamadas exit de nível superior.

Você pode precisar unalias exit eventualmente.

    
por 09.03.2016 / 07:14
1

O nó do problema é que você está obtendo ( . ) o script e não simplesmente executando-os ( ./script2.sh ou /bin/bash script2.sh ).

Se você realmente precisa source , faça isso em uma subshell (. ./myscript2.sh args)

Se você pode executar normalmente os scripts, você pode armazenar em uma variável o código de saída que é atualizado automaticamente após cada execução em $? .

./myscript2.sh arg1
FirstExitCode=$?
./myscript2.sh arg2
SecondExitCode=$?
 ...

Leia mais sobre a origem com help .

    
por 09.03.2016 / 10:27
1

Com base na resposta de Hastur sobre o fornecimento, isso parece ser o que eu preciso em second.sh para retornar um status sem matar o terminal:

#!/usr/bin/env bash
...

# if success, return 0
[ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0

# else for failure, return non-0
[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
    
por 09.03.2016 / 20:22