2015-09-10 1 views
0

Le code ci-dessous imprime Continuing si j'enlève le sous-shell. Avec le sous-shell, j'ai besoin d'un autre appel réussi après le test (en utilisant : comme une commande sans succès réussie est plus simple, IMO) si je veux arriver à la partie Continuing.Comportement bizarre dans sh avec `set -e` et un sous-shell

#!/bin/sh 
set -e #Exit on untested error 
(#Subshell 
    #Some succesfful commands go here 
    #And here comes a file test 
    [ -f "doesntExist" ] && { 
     : #Irrelevant 
    } 
    #: 
) 
echo Continuing 

Est-ce que ce comportement est correct? Pourquoi l'introduction d'un sous-shell changer le comportement des

[ -f "doesntExist" ] && { 
     : 
} 

J'utilise le dash 0.5.7-2ubuntu2 pour exécuter ce.

Répondre

1

Ceci est prévu. set -e ignore un statut de sortie différent de zéro d'une liste ET, mais pas d'un sous-shell. La différence entre

set -e 
[ -f "doesntExist" ] && { 
    : #Irrelevant 
} 
echo Continuing 

et

set -e 
([ -f "doesntExist" && { : ; }) 
echo Continuing 

est que dans le premier cas, votre script voit une liste et avec un état de sortie non nul, mais dans ce dernier, il voit un sous-shell avec un non -zero statut de sortie.