2017-01-12 3 views
1

Tenir compte du code:ksh errexit sur l'exécution conditionnelle

set -ex 
for a in 1 2 3; do 
    [ $a == 1 ] || false 
done 

Le résultat attendu est:

+ [ 1 == 1 ] 
+ [ 2 == 1 ] 
+ false 

Cependant je reçois:

+ [ 1 == 1 ] 
+ [ 2 == 1 ] 
+ false 
+ [ 3 == 1 ] 
+ false 

Pour certains ksh raison décide de ne pas quitter après le false à la deuxième itération.

L'exécution de ce script via bash fournit les résultats attendus.

Chose intéressante, je peux convaincre ksh de fournir les résultats escomptés en modifiant le code:

set -ex 
for a in 1 2 3; do 
    [ $a == 1 ] || false 
    true 
done 

qui, à la surface, tout ce que je fais est d'ajouter une commande true qui est censé faire efficacement rien .

Ma version ksh (par défaut sur OpenBSD 6.0) est: @(#)PD KSH v5.2.14 99/07/13.2

Je voulais vous assurer qu'il n'y a pas quelque chose que je suis absent avant que je décide de faire un rapport de bug.

Répondre

2

Je n'irais pas jusqu'à le soumettre comme un bug, regardons maintenant l'histoire.

Les versions Korn shell existantes actuelles sont

Votre version ksh tombe dans la deuxième catégorie qui dit selon cette source,

pdksh est le domaine public shell Korn, un clone du Korn Shell. Il a la plupart des fonctionnalités de ksh88, et presque aucune des fonctionnalités de ksh93. La dernière version, pdksh 5.2.14 de 1999 Juillet 13, a encore plusieurs bugs. Des systèmes tels que Debian, OpenBSD et PLD appliquent maintenant plusieurs correctifs à pdksh.

donc pas étonnant que votre ksh version est assez obsolète, et j'ai essayé d'obtenir un entretien journal des modifications pour votre version shell et le comparer avec les versions où le patch pour votre problème signalé et je ne pouvais pas le trouver, pas étonnant qu'il ne soit plus maintenu.

Mais même sur la dernière ksh93 la version sur mon MacOSX, sh (AT&T Research) 93u+ 2012-08-01, l'exécution de votre script produit exactement comme prévu,

+ [ 1 '==' 1 ] 
+ [ 2 '==' 1 ] 
+ false 

Proposer la mise à niveau ksh version pour d'autres recherches que le vôtre est assez obsolète et sujettes aux erreurs, ou si vous voulez toujours signaler, en supposant qu'il existe un support actif pour cela, vous pouvez tendre la main à la liste de diffusion mentionnée dans la section Bugs de ce pdksh(1) - Linux man page.

0
+0

Bien que ce lien peut répondre à la question, il est préférable d'inclure les éléments essentiels de la réponse ici et de fournir le lien de référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – Marusyk

+0

Très peu probable car le premier est une archive de listes de diffusion et le second est le journal officiel de code source: ^) Néanmoins, merci pour l'information - je garderai cela à l'esprit. – rjc