Оболочка MirBSD Korn или mksh - это бесплатный интерпретатор команд (оболочка), предназначенный как для интерактивного использования, так и для использования в сценариях оболочки. mksh - это оболочка по умолчанию в Android, некоторых BSD и некоторых дистрибутивах Embedded Linux, и она доступна для большинства других операционных систем. Используйте тег "ksh" для общих вопросов Korn Shell и тег "mksh" (дополнительно), если ваш вопрос нацелен конкретно на mksh.

О мкш

Оболочка MirBSD Korn или mksh, представляет собой интерпретатор команд (оболочку), предназначенный как для интерактивного использования, так и для использования в сценариях оболочки. Его командный язык является надмножеством оболочки Bourne/POSIX (sh) и в значительной степени совместим с исходной оболочкой Korn (ksh88).

Оболочка MirBSD Korn Shell нацелена на то, чтобы быть компактной, последовательной, быстрой, не раздуваемой, но также удобной в использовании оболочкой как для интерактивного использования, так и для использования в сценариях. В то время как некоторые расширенные функции других оболочек (такие как программируемое / настраиваемое завершение табуляции) недоступны, и были сделаны некоторые конструктивные решения, чтобы сохранить его маленьким, многие функции других современных оболочек Unix (GNUbash, AT&T ksh93, а также zsh) доступны; mksh нацелен на обеспечение тех же функций в каждой системе, в которой он работает, если это вообще возможно, чтобы помочь людям, пытающимся создать переносимый сценарий (но желающим потребовать особую оболочку).

mksh одобренное OSI программное обеспечение с открытым исходным кодом ™ и активно развивающееся преемник pdkshи оболочка по умолчанию на Android, некоторые варианты BSD и некоторые (в основном встроенные) дистрибутивы Linux. Он также доступен для большинства других операционных систем и дистрибутивов.

Внешняя ссылка

Вопросы-Ответы

POSIX

mksh активно развивается, как и стандарт POSIX; когда что-то в последнем изменяется, mksh обычно корректируется для соответствия, независимо от того, какая версия стандарта опубликована в настоящее время.

Поскольку mksh разработан как переносимая оболочка, а не как интегрированная в одну операционную систему, было решено, что ее задача вести себя согласованно во всех операционных системах (так что сценарии оболочки могут рассчитывать на согласованное поведение во время выполнения), даже игнорируя POSIX, когда это необходимо для этого. Например, арифметика -echo $((2147483647 + 1)) - всегда использовать 32-битные целые числа и определять способ обработки переполнения.

Там, где POSIX отличается, есть две "ручки", чтобы приблизить mksh к POSIX. Одинset -o posix, который изменяет некоторое поведение оболочки во время выполнения (и, как побочный эффект, по умолчанию отключает раскрытие фигурных скобок). Другой - использоватьlksh двоичный файл, который должен предлагать большинство дистрибутивов mksh, вместо mkshдвоичный; вlksh, арифметика выполняется в соответствии с POSIX, то есть с C хоста long тип данных, а переполнение - неопределенное поведение.

Подробнее о различиях между mksh а также lksh, и между бегом без и с set -o posix, пожалуйста, обратитесь к руководству.

Трубы: a=u; echo x | read a; echo $a

POSIX позволяет оболочке запускать обе стороны канала в подпроцессе, что эквивалентно a=u; (echo x) | (read a); echo $a- или только один. mksh делает первое.

Если вам действительно нужно считывать данные из конвейера в текущую среду выполнения, вы можете перепроектировать свою программу так, чтобы она работала по-другому, или использовать сопроцесс: a=u; echo x |& read a; echo $a

Замена процесса

Расширение GNU bash <(command)еще не поддерживается изначально (хотя он находится в списке TODO). На данный момент у этого ответа есть обходной путь.

Локали (POSIX)

Поскольку mksh разрабатывается независимо от какой-либо широко распространенной операционной системы и переносится на многие странные и / или древние, мы не можем использовать функции локали ОС. mksh реализуетC(POSIX) языковой стандарт и языковой стандарт "UTF-8". Какой из них активен, в настоящее время не зависит от параметров локали POSIX, но выбирается с помощьюset ±U (set ±o utf8-mode); со временем это изменится.

Чтобы mksh (или lksh) использовал режим UTF-8, если текущий языковой стандарт POSIX - UTF-8, и C в противном случае используйте: set -U; [[ ${LC_ALL:-${LC_CTYPE:-${LANG:-}}} = *[Uu][Tt][Ff]?(-)8* ]] || set +U

Если вам нужно интегрировать это в sh скрипт, запустите этот код, только если скрипт запускается mksh или lksh:

case ${KSH_VERSION:-} in
*MIRBSD KSH*|*LEGACY KSH*)
        case ${LC_ALL:-${LC_CTYPE:-${LANG:-}}} in
        *[Uu][Tt][Ff]8*|*[Uu][Tt][Ff]-8*) set -U ;;
        *) set +U ;;
        esac ;;
esac

Однако в ближайшем будущем mksh будет отслеживать эти переменные окружения самостоятельно.

Восьмеричные целые числа (POSIX)

POSIX изменился, чтобы требовать целые числа с ведущими 0интерпретироваться как восьмеричные цифры; это ломает скрипты влево и вправо. mksh поддерживает:

$ echo 1: $((010)); set -o posix; echo 2: $((010))
1: 10
2: 8

История командной строки

Постоянная история по умолчанию отключена из соображений конфиденциальности. Чтобы включить его, установитеHISTFILEна путь к файлу истории (двоичному) в стиле pdksh. Не используйте файл истории в стиле bash (ASCII), так как он может быть перезаписан и поврежден. Вы также можете установитьHISTSIZE, но не до безумно высоких значений, так как память выделена заранее. Вы можете поместить это в~/.mkshrc:

export HISTFILE=~/.pdksh_history HISTSIZE=65536

Постоянный файл истории является общим для параллельных сеансов оболочки; синхронизация происходит при нажатии Enter после команды.

Некоторые mksh двоичные файлы не компилируются с поддержкой постоянной истории, например, Android (из-за среды, специфичной для телефона) или для операционных систем без mmap. Тогда он просто не создаст файл.

Примечания по совместимости с AT&T Korn Shell

Подобно ksh93, функции, определенные с function ключевое слово, в отличие от name()синтаксис, имеют собственные флаги оболочки (в последних версиях); это означает, что вы можете, например, переключать режим UTF-8 внутри функции, и он восстанавливается после выхода из нее.

Однако, в отличие от ksh93, local переменные работают в функциях обоих типов, а mksh (как и все другие оболочки nōn-AT и T-ksh) использует модель вложенной области видимости (то есть локальные переменные вызывающей стороны доступны для вызываемого). namerefs реализованы немного иначе: они разрешаются к цели каждый раз, когда они вызываются / используются, а не во время определения, поэтому они могут ссылаться на собственные локальные переменные функции, если не будут осторожны.

В DEBUG ловушка и обращение с ERR а также EXITловушки в функциях (от ksh88) пока не реализованы; обработка с плавающей запятой реализована не будет. Некоторые расширения ksh93 после 1993 г. еще не реализованы, некоторые в конечном итоге будут реализованы.

Ассоциативные массивы

… Находятся в списке намеченных к реализации. mksh/assockit.kshв репозитории shellsnippets содержится используемый в настоящее время (иногда немного медленный) обходной путь с помощью функций оболочки;mksh/assoldap.ksh - хороший пример использования (привязки LDAP для оболочки).

При вызове как /bin/sh

… В некоторых операционных системах (например, MidnightBSD, Debian) активирован режим совместимости. Это включает в себя включениеset -o posix (лучшая совместимость с POSIX), set -o sh(причуды устаревшего сценария) или и то, и другое. Это может изменить поведение.

Сообщения об ошибках, список рассылки, дополнительные ресурсы

Канал IRC #!/bin/mkshв сети IRC Freenode - это место, где вы можете задавать вопросы, сообщать об ошибках и т. д. - обычно есть несколько добровольцев / пользователей, и разработчики большую часть времени читают отставание. Вы также можете спросить в#ksh( Infopage), если вы укажете, что используете mksh. Также есть список рассылки (см. Нижнюю часть справочной страницы), который вы можете прочитать в Интернете, например, через GMane.

Поскольку многие люди изучают программирование, глядя на чужой код, проект Shell-Toolkit (shellsnippets) нацелен на сбор некоторых. Дополнительные ресурсы можно найти в #kshинформационная страница.