Último status de saída de dentro do script sem fonte

3

Supondo que alguém invoque um comando inexistente, a única maneira que sei de recuperar seu status de erro de um script que eu execute logo depois é usando source

Ou seja, digamos que o nome desse script seja dummy , onde seu conteúdo é simplesmente

#!/bin/bash

echo $?

Eu sei que só vou obter o status de saída que estou procurando (127) se eu invoco source dummy , mas existe outra maneira de facilitar o status de saída (de preferência sem usar alias ) do último comando de dentro do script, sem usar source , então eu poderia simplesmente chamar dummy para obter o meu comportamento desejado?

Estou simplesmente tentando criar um script para verificar um erro de digitação no comando anterior. Isso requer a detecção do status de saída anterior para garantir que houve um erro de digitação em potencial, portanto, preciso poder obter o status de saída do último comando no script. Eu também estou esperando minimizar a quantidade de configuração que um usuário teria que fazer, de modo que um usuário pudesse simplesmente invocar dummy , por exemplo, e o restante seria resolvido. Este é o meu motivo para tentar evitar source ou . ou alias .

Meu teste inicial para o status de saída do último comando foi usar

#!/bin/bash
ESTATUS=$? # Saved exit status for later
echo $ESTATUS

mas isso exigia a execução desse script com source . Existe uma boa maneira de replicar isso sem ter que usar source ou . ?

    
por Francesco Gramano 24.04.2015 / 14:30

4 respostas

1

Não sei ao certo para onde isso levará, mas você pode fazer isso:

alias dummy='sh dummy $?'
the_program_with_errors
dummy

e seu script dummy conteria:

echo $1

Uma abordagem sem alias é usar uma função de shell:

function dummy { sh dummy $? ;}

Com essa definição, você pode obter o seguinte comportamento (simulado com true , false e um processo subshell):

$ true 
$ dummy
0
$ false
$ dummy
1
$ (exit 42)
$ dummy    
42
    
por 24.04.2015 / 14:38
2

Você talvez possa usar o script no link (conforme discutido em link ) e usar a função precmd () para fazer o seu $? verificando

    
por 24.04.2015 / 15:37
1

Parece-me que os scripts que você está chamando devem fornecer as respostas que você deseja. Aqui está uma maneira de testar um comando e usar um código de saída específico nesses scripts.

#!/bin/bash

# Test for the existence of a command in the path.
command=typo_command
if [[ ! $(command -v $command) ]]; then
    echo "$command does not exist"
    exit 127 # or the code you choose
fi
    
por 24.04.2015 / 15:47
1

Escreva uma função

Seu shell é um processo e tem um valor para $? . Seu script é um processo filho separado e tem seu próprio valor para $? .

Se você quiser poder verificar o $? pertencente ao seu shell, você precisa do seu comando para executar no processo do shell. source é uma maneira de fazer isso, mas uma maneira mais simples é escrever uma função.

function dummy(){
  echo $?
}

Se declarado no usuário .bashrc ou equivilant, isso deve estar disponível e funcionar conforme o esperado.

(Se você quiser, pode até chamar um script para fazer o que você quiser, e passar para o script o valor de $? .)

    
por 09.03.2016 / 18:28