Bash – comment faire précéder l'opérateur explicite sans créer un sous-shell

Je suis sûr que c'est posté quelque part, mais je n'ai pas pu le find.

Dans Bash, comment spécifier la précédence de l'opérateur (aka groupage de commands) sans créer un sousshell? Dans la plupart des autres langages, the () fait, mais dans Bash, il exécute les commands dans un sous-shell qui "se défait" de l'environnement change. Je veux spécifier la priorité de l'opérateur sans perdre les changements d'environnement.

Plus précisément, j'aimerais faire quelque chose comme ça et avoir la sortie complète du script, pas seulement le sous-shell dans le () :

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

J'ai trouvé une "solution de contournement" en faisant cela, mais ce n'est pas un joli one-liner comme je le veux:

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

Le résultat désiré est de ne rien faire et de continuer si CHRUBY est CHRUBY , d'appeler la fonction installChruby si CHRUBY est Y ou Y et d'appeler la fonction die uniquement si la fonction installChruby renvoie false.

Existe-t-il un opérateur dans Bash qui le fait en plus () , ou y a-t-il un moyen de dire que le code à l'intérieur de () ne s'exécute pas dans un sous-shell?

de l' 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.