mksh R40
Версия реализации mksh языка программирования Unix shellmksh 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
без аргументов, для совместимости с SUSv4dot.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
]]>