Erro de script do shell ao atribuir STDOUT a variável

4

Estou tentando implementar a manipulação de erros no meu script de shell, conforme descrito na segunda resposta em Melhor prática para usar $? no bash?

Meu script é assim:

#!/bin/bash

try() {
    "$@"
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

try myvar=$(mktemp -p ./)

O script sai com um

./test.sh: line 4: myvar=./tmp.scNLzO1DDi: No such file or directory
oops myvar=./tmp.scNLzO1DDi didn't work

Apenas,

myvar=$(mktemp -p ./)

é claro funciona bem, e $ myvar retorna o caminho completo e o nome do arquivo temporário.

Como posso obter a instrução para atribuir o nome do arquivo tmp à variável myvar, enquanto ainda passa a instrução inteira e seus resultados para try (), então try () pode fazer o que precisa? Obrigado.

    
por Jim Walker 09.09.2014 / 13:03

2 respostas

1

Acho que você deseja usar uma armadilha de erros em vez de um wrapper em torno da avaliação.

err_handler () {
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

trap 'err_handler' ERR
myvar=$(mktemp -p ./)
trap ERR
    
por 13.09.2014 / 21:26
4

Com try myvar=$(mktemp -p ./) , o subshell com o mktmp é executado antes de try ser chamado, durante a construção da lista de argumentos para try .

Para fazer com que a subzela seja expandida posteriormente, é necessário citar o argumento de try :

try 'myvar=$(mktemp -p ./)'

Para fazer a expansão mais tarde, você precisa usar eval "$@" em vez de "$@" na primeira linha de try .

    
por 09.09.2014 / 13:19