Script de compatibilidade: Salvar $? para uso posterior

3

Gostaria de escrever uma pequena parte de um script que salve o status do erro, execute algum outro código e defina o status do erro como o status original do erro. No Bash, é assim:

<< some command >>; _EXIT=$?;( <<other code here>> ;exit $_EXIT)

Mas eu preciso de código que seja executado, não importa se está sendo executado sob o bash, zsh, csh ou tcsh. Eu não sei qual shell será usado com antecedência, porque é decidido pelo usuário. O usuário também decide < < algum comando > >.

É seguro assumir que < < outro código > > irá funcionar em todos os shells, mas não é seguro assumir que você pode escrever um arquivo (então colocá-lo em um arquivo não funcionará).

Plano de fundo

O GNU Parallel executa comandos dados pelo usuário no shell decidido pelo usuário. Quando o comando terminar, o GNU Parallel tem alguma limpeza para fazer. Ao mesmo tempo, o GNU Parallel precisa lembrar o valor de saída do comando dado pelo usuário. O código executado antes do snippet acima é o comando dado pelo usuário. < < outro código > > é o código de limpeza.

    
por Ole Tange 16.01.2015 / 00:24

2 respostas

0

Use perl:

perl -e '$a=shift; '<< other code >>'; exit $a' $? # Fails in csh

Editar Isso também funciona em csh (e zsh, tcsh, sh, pdksh, ksh93 - mas não em fish):

perl -e '$a=shift; '<< other code >>'; $a=~s/h// and exit $a; exit shift' "$?h" "$status"
    
por 16.01.2015 / 01:30
0

Esta resposta funciona em shells semelhantes a shells e shells semelhantes a csh, e não requer perl:

sh -c '<< other code >>; [ "$0" != "" ] && exit "$0"; exit "$1"' "$?" "$status"

ou você pode adicionar um parâmetro dummy / pad:

sh -c '<< other code >>; [ "$1" != "" ] && exit "$1"; exit "$2"' foo "$?" "$status"

e o teste pode ser alterado para [ ! -z "$0" ] (ou "$1" ). Não sei se vai funcionar em zsh ou fish. Cada casca que conheço avaliará $? e $status quando o comando é analisado e passá-los para o comando sh -c como parâmetros. O shell sh os atribui aos dois últimos parâmetros posicionais. Quando o "outro código" terminar, o shell verificará o parâmetro posicional que obteve seu valor de $? para ver se é nula ou não nula, e saia com o valor do parâmetro posicional apropriado.

Isso falhará se o shell do ambiente usar algo diferente de $? ou $status para manter o status de saída. Ele também falhará se o shell permitir que $? seja definido (não nulo) se não for o status de saída ou se $? for uma sequência de caracteres inválida que faz com que todo o comando seja rejeitado como um erro de sintaxe.

    
por 23.01.2015 / 22:09

Tags