Bash - como tornar a precedência explícita do operador sem criar um subshell

5

Tenho certeza de que isso está postado em algum lugar, mas não consegui encontrá-lo.

No Bash, como alguém especifica a precedência do operador (também conhecido como agrupamento de comandos) sem criar um subshell? Na maioria das outras linguagens, o () faz isso, mas no Bash isso executa os comandos em um subshell que "descarta" mudanças no ambiente. Eu quero especificar a precedência do operador sem perder as alterações do ambiente.

Especificamente, gostaria de fazer algo assim e ter o script inteiro como saída, não apenas a subshell no () :

die ()
{
    echo "[DIE]: $1"
    exit 1
}

# When installChruby returns an error, print the error message and exit
[[ $CHRUBY =~ [Yy] ]] && (installChruby || die "Error installing chruby")

Eu descobri uma "solução alternativa" ao fazer isso, mas não é uma frase simples como eu quero:

if [[ $CHRUBY =~ [Yy] ]]; then installChruby || die "Error installing Chruby"; fi 

O resultado desejado é não fazer nada e continuar se CHRUBY não estiver definido, chamar a função installChruby se CHRUBY for Y ou y e chamar a função die somente se a função installChruby retorna falso.

Existe um operador no Bash que faz isso além de () , ou existe uma maneira de dizer ao código dentro do () para não rodar em um sub-shell?

    
por Freedom_Ben 22.09.2014 / 18:10

1 resposta

2

de man bash :

   { list; }
          list  is  simply executed in the current shell environment.  list must be terminated with a newline or semicolon.
          This is known as a group command.  The return status is the exit status of list.  Note that unlike the  metachar‐
          acters  (  and  ), { and } are reserved words and must occur where a reserved word is permitted to be recognized.
          Since they do not cause a word break, they must be separated from list by whitespace or another shell metacharac‐
          ter.
    
por 22.09.2014 / 18:17