]]> ]]>

mksh R40

Версия реализации mksh языка программирования Unix shell

mksh R40 — значительное обновление MirBSD Korn Shell, добавляющее новую функциональность и исправляющее множество известных ошибок.

В частности, были добавлены встроенные команды cat и sleep; Android, FreeMiNT и Haiku теперь являются поддерживаемыми платформами; множество улучшений для интерактивного режима; улучшена совместимость с POSIX/SUSv4; поддерживается оптимизация времени сборки и LLVM Dragonegg; рефакторинг кода; поддержка стандарта Unicode версии 6.0.0; поддержка множества расширений из bash/ksh93/zsh: $"…", ${PIPESTATUS[*]}, case ;& и ;|, x+=y, x+=(y z) и др.; новый рекурсивный парсер, исправляющий проблемы с подстановкой команд; функции наследуют set -x; встроенная команда read теперь может читать n байт в массив слов или символов, с таймаутом; улучшена работа с “here document”.

Изменение, ломающее совместимость: команда set ±o arc4random теперь считается устаревшей и будет удалена из следующих версий.

Подробный список изменений:

  • Начато портирование mksh на Plan 9 (в среду ANSI’n’POSIX, не закончено)

  • Сборка для Syllable Desktop (не закончено, недостающее может быть ошибкой ядра)

  • Исправлены мелкие ошибки в man-странице и скрипте сборки

  • Сборка для Haiku (возможно, как следствие, порт на BeOS, но это еще не протестировано)

  • Добавлена специфичная для Haiku опция RLIMIT_NOVMON ‘V’ для команды ulimit

  • Build.sh нормально обрабатывает недоступность dirname

  • В режиме редактирования Emacs, октеты 7 старших бит теперь считаются “символами движения” для границ слов – Esc+b, Esc+f, ^W, …

  • Значение по умолчанию EXECSHELL можно настраивать во время компиляции

  • Для установленного MKSH_SMALL, не компилировать в “set -o bgnice” по умолчанию

  • Переделано соответствие RLIMIT_{AS,RSS,VMEM} и ‘m’ и ‘v’ ulimits

  • Добавлены еще несколько ограничений, специфичных для ОС, из zsh

  • Совместимость SUSv4 ${v=a b} и “${v=a b}” и ${v-a b}, тесты

  • Путь “~/.mkshrc” можно настраивать во время компиляции

  • Исправлено сообщение об ошибке SUNWcc 12.1 в build phase=u

  • Исправлена область видимости присваивания переменной во время выполнения команды (expansion vs. assignment execution environment), добавлены регрессионные тесты для этого

  • Исправлены одиночные кавычки в “${foo#bar}” (отличается от “${foo-bar}”)

  • Исправлено сообщение об использовании mknod: “b|c не опциональны”

  • Исправлено расширение “${x#?}” в кавычках

  • Временную директорию по умолчанию теперь можно настраивать во время компиляции

  • Исправлены проблемы с производительностью встроенной функции realpath

  • Устаревшие -longoptions для Build.sh заменены на более короткие: -valgrind становится -g (как debug), -combine и -llvm становятся -c {combine,llvm}, а флаги оптимизатора LLVM передаются через -O = -o -std-compile-opts

  • Новые опции Build.sh -c dragonegg (для использования плагина LLVM к GCC 4.5 с оптимизацией взаимодействия модулей), -v (версия)

  • Задокументирован еще один способ получить цветной PS1 на man-странице

  • Запрещены еще несколько способов обрезки вектора

  • Упрощен код RCSID и синхронизации комментариев с OpenBSD ksh

  • Применен патч, решающий проблему с LINENO

  • Исправление ошибок, ускорение работы и удаление устаревших функций, связанных с использованием случайных чисел

  • Исправлены ошибки правописания в dot.mkshrc

  • Реализовано живое изменение размеров окна для Emacs-режима редактирования

  • Исправлены ошибки, найденные при помощи Valgrind и LLVM+Clang scan-build

  • Небольшие исправления man-страницы

  • printf.c.1.15 теперь использует подпрограммы mksh shf_* вместо stdio

  • Исправления для -Wc++-compat, за исключением явных преобразований из/в “void *”

  • Исправления в подпрограммах ввода-вывода shf buffer

  • Исправлено разыменование NULL-указателя в цикле при проверки рекурсии алиасов

  • Больше преобразований int → bool, выравнивание и рефакторинг кода

  • Исправление проблем с проверкой размеров окна при работе внешних программ

  • Улучшено описание mksh(1) на man-странице, убраны упоминания not-mksh

  • Используется wcwidth() из system на MirBSD

  • Больше нет необходимости использовать u_int32_t

  • Предоставляется uint8_t, если не найден.

  • Исправлена работа встроенной команды realpath для аргументов “/file/”

  • Отсутствующий <stdint.h> больше не создается из from Build.sh

  • Добавлена встроенная команда “cat”

  • Уменьшен размер за счет оптимизации работы со строками, структурами, и другими улучшениями кода

  • Задокументирован способ обойти при помощи x=$(eval $(cat)) <<'EOF' ошибку разбора $(…)

  • Добавлена поддержка аргумента “—” для большего количества встроенных функций

  • Исправлены опечатки и тексты сообщений об ошибках

  • Нет алиасов stop и suspend на Android (специфичный для системы конфликт)

  • Исправлены потенциальные проблемы безопасности при сложении и умножении целых чисел, добавлена проверка setres{u,g}id/setuid для EAGAIN (в данный момент только для Linux)

  • Исправлены проблемы, приводящие к предупреждениям в mirtoconf и при сборке некоторыми компиляторами

  • Исправлено описание отличий c? и c~ в mksh(1)

  • Удален недостаточно переносимый файл setmode.c из дистрибутива; mknod теперь является опциональной встроенной командой, отключенной по умолчанию и включенной вручную только для MirBSD

  • Изменено поведение exit без аргументов, для совместимости с SUSv4

  • dot.mkshrc больше не экспортирует $PS1 для избежания конфликтов с другими командными оболочками

  • Таблица ширин символов синхронизирована с Unicode 6.0.0

  • MKSH_SMALL больше не подразумевает HAVE_REVOKE=0

  • Игнорируется ‘$’ перед ‘”…”’ (как в bash, ksh93)

  • Поддержка синтаксиса foo=<<EOF для присваивания “here document” (или “here string”) переменной

  • Добавлены переменные KSHEGID, KSHGID, KSHUID

Примеры:

Hello, World! - Unix shell, Foma (368):

echo Hello, World!

Факториал - Unix shell (369):

Пример, работающий в версиях Unix shell, не поддерживающих синтаксис for i in {0..16} или ((i = 0; i <= 16; i++)): цикл for конструируется “вручную”.

В mksh используются 32-битовые целые числа, так что для факториалов чисел больше 13 в этой реализации происходит переполнение.

function factorial {
    typeset -i n=$1
    if [ $n = 0 ]; then
        echo 1
        return
    fi
    echo $(( n * $(factorial $(( n - 1 )) ) ))
}

i=0
while [[ $i -le 16 ]] 
do
    echo "$i! = $(factorial $i)"
    ((i++))
done

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам