Como tornar 'local' capturar o código de saída?

10

No meu projeto, tenho o seguinte snippet:

local output="$(bash "${1##*/}")"
echo "$?"

Isso sempre imprime zero devido a local , no entanto, remover local faz com que a variável $? se comporte corretamente: o que é assumir o código de saída da subcamada.

A minha pergunta é: como posso manter esta variável local ao mesmo tempo que capto o valor de saída?

    
por Ultimate Hawk 07.05.2016 / 21:24

2 respostas

16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

Isto irá ecoar 127 , o código de erro correto para "comando não encontrado".

Você pode usar local para definir mais de uma variável. Então, eu também apenas criei a variável local RET para capturar o código de saída da subshell antes de local suceder e definir $? para zero.

    
por 07.05.2016 / 21:29
26

Declare a variável local antes de atribuí-la:

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

Na minha opinião, isso também é mais legível do que definir uma variável RET adicional. YMMV sobre isso, mas funciona exatamente como você esperaria.

    
por 07.05.2016 / 22:37