2017-01-12 16 views
1

Рассмотрим код:КШ errexit на условное исполнение

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

Ожидаемый результат:

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

Однако я получаю:

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

По какой-то причине KSH решает не выходить после false на второй итерации.

Выполнение этого сценария через bash дает ожидаемые результаты.

Интересно, что я могу убедить Ksh обеспечить ожидаемые результаты, изменяя код:

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

Что на поверхности, все, что я делаю, добавив true команду, которая, как предполагается, чтобы эффективно делать ничего ,

Моя версия КШ (по ​​умолчанию в OpenBSD 6.0) является: @(#)PD KSH v5.2.14 99/07/13.2

Я хотел, чтобы убедиться, что это не то, что я пропускаю, прежде чем я решил сообщить об этом как об ошибке.

ответ

2

Я бы не пошел так далеко, как представить его как ошибку, давайте посмотрим на некоторую историю сейчас.

В настоящее время существующей Korn оболочки версии

  • Если результат выглядит версия JM 93u 2011-02-08, то у вас есть ksh93.
  • Если выход выглядит как @(#)PD KSH v5.2.14 99/07/13.2, то у вас есть pdksh (Public Domain Korn Shell).
  • Если результат выглядит как @(#)MIRBSD KSH R49 2014/01/11, то у вас есть mksh (MirBSD Korn Shell).

Ваша версия ksh попадает во вторую категорию, которая, согласно этому источнику говорит,

pdksh является общественным достоянием Korn оболочки, клон Korn Shell. Он имеет большинство функций ksh88 и почти ни один из функций ksh93. Последняя версия, pdksh 5.2.14 с 1999 года 13 июля, все еще имеет несколько ошибок. Такие системы, как Debian, OpenBSD и PLD, теперь применяют несколько исправлений до pdksh.

Так что не удивительно, что ваш КШ версии не очень устарел, и я попытался получить надлежащее обслуживание переключающего журнал для вашей версии оболочки и сравнить его с релизами, в которых патч для описанной проблемы, и я не мог найди его, неудивительно, что он больше не поддерживается.

Но то же самое на последнюю ksh93 версии на мой MacOSX, sh (AT&T Research) 93u+ 2012-08-01, работает сценарий производится точно так, как вы ожидали,

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

Предлагайте обновление КШ версии для дальнейших исследований, как ваш есть довольно устаревший и подверженный ошибкам, или если вы хотите, чтобы все еще хотите сообщить, если у вас есть активная поддержка, вы можете обратиться к списку рассылки, указанному в разделе Bugs этого pdksh(1) - Linux man page.

0
+0

Хотя эта ссылка может ответить на этот вопрос, то лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Marusyk

+0

Весьма маловероятно, поскольку первый из них является архивом списков рассылки, а второй - официальным журналом исходного кода: ^) Тем не менее, спасибо за информацию - я это помню. – rjc