Открыть сервис

Korn shell

Korn shell (ksh) — это командная оболочка (интерпретатор команд) для операционных систем семейства Unix, разработанная Дэвидом Корном (David Korn) в AT&T Bell Laboratories в начале 1980-х годов. Она сочетает в себе возможности Bourne shell (sh) и C shell (csh), добавляя расширенные средства для написания сценариев (скриптов), такие как встроенная поддержка арифметических операций, ассоциативных массивов, операций со строками и улучшенные управляющие конструкции. Korn shell является одной из наиболее мощных и широко используемых оболочек в корпоративной среде и на серверах, особенно в системах, где требуется высокая производительность и совместимость с POSIX.

История

Разработка и ранние версии

Первая версия Korn shell (ksh88) была выпущена в 1988 году. Она была разработана как надстройка над Bourne shell, с целью устранения его недостатков и добавления функциональности, характерной для C shell, но с сохранением обратной совместимости. В 1993 году вышла вторая версия (ksh93), которая стала значительным обновлением: она включала поддержку ассоциативных массивов, встроенную арифметику с плавающей точкой, динамические библиотеки и улучшенную обработку сигналов. Эта версия была стандартизирована как часть POSIX.2 и стала де-факто стандартом для многих коммерческих Unix-систем.

Распространение и лицензирование

Изначально ksh распространялся как проприетарное программное обеспечение AT&T. В 2000 году, после приобретения AT&T компанией Lucent Technologies, исходный код ksh93 был выпущен под открытой лицензией Common Public License (CPL). Позднее, в 2012 году, проект был передан в руки сообщества, и с 2014 года разработка ведётся в рамках форка ksh2020 (позднее переименованного в ksh-community). Однако из-за разногласий в сообществе в 2020 году был создан форк mksh (MirBSD Korn Shell), который ориентирован на лёгкость и переносимость, особенно на встраиваемые системы.

Современное состояние

На сегодняшний день Korn shell продолжает развиваться в нескольких форках. Основной веткой считается ksh93u+m (форк, поддерживаемый AT&T и сообществом), а также mksh (используется в операционных системах Android, OpenBSD и некоторых дистрибутивах Linux). В 2023 году была выпущена версия ksh93u+m, которая исправила множество ошибок и добавила поддержку Unicode.

Классификация

Korn shell относится к классу командных оболочек Unix и может быть классифицирована по нескольким признакам:

  • По происхождению: потомок Bourne shell (sh) с элементами C shell (csh).
  • По стандартизации: соответствует стандарту POSIX.2 (IEEE Std 1003.2).
  • По типу: интерактивная (для работы в терминале) и неинтерактивная (для выполнения скриптов).
  • По функциональности: расширенная оболочка с поддержкой ассоциативных массивов, арифметики с плавающей точкой, встроенных функций и динамических библиотек.

Устройство и характеристики

Синтаксис и управляющие конструкции

Korn shell наследует синтаксис Bourne shell, но добавляет:

  • Условные операторы: if, elif, else, case, select (цикл выбора из меню).
  • Циклы: for, while, until, а также foreach (унаследован от csh).
  • Арифметика: $(( ... )) для целочисленных операций и $(( ... )) с плавающей точкой (в ksh93).
  • Обработка строк: встроенные функции для работы с подстроками, поиска и замены (например, ${var#pattern}, ${var%pattern}, ${var/pattern/replacement}).
  • Ассоциативные массивы: объявляются как typeset -A arr, обращение по ключу: arr[key]=value.

Встроенные команды

Korn shell включает множество встроенных команд, которые не требуют вызова внешних программ:

  • echo, print, printf (вывод данных).
  • read (чтение ввода).
  • test и [ ] (проверка условий).
  • exec, eval, source, trap (управление процессами и сигналами).
  • let, typeset, alias, unalias (управление переменными и псевдонимами).

Переменные и окружение

  • Переменные: объявляются как var=value, обращение через $var или ${var}.
  • Типизация: с помощью typeset можно задать тип переменной (целое число, строка, массив, ассоциативный массив).
  • Окружение: переменные экспортируются в дочерние процессы через export.

Скрипты и функции

  • Функции: определяются как function name { ... } или name() { ... }. Поддерживаются локальные переменные (typeset -l), рекурсия и передача аргументов.
  • Скрипты: файлы с расширением .ksh или без него, начинающиеся с шебанга #!/bin/ksh или #!/usr/bin/ksh.

Интерактивный режим

  • Редактирование командной строки: поддерживается режим vi (по умолчанию) и emacs (через set -o emacs).
  • История команд: доступна через history, fc и клавиши стрелок.
  • Автодополнение: встроенное (для файлов, команд, переменных) и настраиваемое через complete.

Применение

Серверное администрирование

Korn shell широко используется в корпоративных средах для написания сценариев автоматизации, управления конфигурациями, резервного копирования и мониторинга. Благодаря высокой производительности и совместимости с POSIX, он часто применяется в системах IBM AIX, HP-UX, Solaris и других коммерческих Unix-системах.

Разработка программного обеспечения

Многие разработчики используют ksh для написания сборочных скриптов (Makefile-подобных), тестовых фреймворков и утилит для непрерывной интеграции. Его мощные возможности по обработке строк и арифметике делают его удобным для задач, не требующих использования полноценных языков программирования.

Встраиваемые системы

Форк mksh (MirBSD Korn Shell) оптимизирован для работы на устройствах с ограниченными ресурсами (например, в роутерах, на базе OpenWrt, или в Android). Он имеет малый размер (около 100 КБ) и минимальные зависимости.

Образование

Korn shell используется в учебных курсах по Unix-администрированию и программированию оболочек, так как он сочетает в себе простоту Bourne shell и мощь C shell, позволяя изучать обе парадигмы.

Примеры

Пример 1: Простой скрипт

```bash

!/bin/ksh

Вывод приветствия

echo "Введите ваше имя:" read name print "Привет, $name!" ```

Пример 2: Ассоциативные массивы

```bash

!/bin/ksh

typeset -A users users["alice"]=1001 users["bob"]=1002 for user in "${!users[@]}"; do print "Пользователь $user имеет UID ${users[$user]}" done ```

Пример 3: Арифметика с плавающей точкой (ksh93)

```bash

!/bin/ksh93

x=3.14 y=2.71 result=$(( x * y )) print "Результат: $result" ```

Интересные факты

  • Korn shell был назван в честь своего создателя Дэвида Корна, который работал в AT&T Bell Laboratories. Он также известен как автор языка AWK (совместно с Альфредом Ахо и Питером Вайнбергером).
  • В 1994 году Korn shell был выбран в качестве стандартной оболочки для операционной системы IBM AIX (версии 4.0 и выше).
  • В 2000 году исходный код ksh93 был опубликован под открытой лицензией, что сделало его доступным для широкого круга разработчиков и сообществ.
  • Существует множество форков и производных оболочек, основанных на ksh, включая pdksh (Public Domain Korn Shell), bash (Bourne Again Shell, хотя он не является прямым потомком, но заимствует многие идеи), и zsh (Z Shell, который также вдохновлён ksh).

Критика

Несмотря на свою мощь, Korn shell подвергается критике за:

  • Сложность синтаксиса: по сравнению с более современными оболочками, такими как bash или zsh, ksh имеет менее интуитивный синтаксис для некоторых операций (например, обработка строк).
  • Фрагментация: наличие нескольких форков (ksh88, ksh93, mksh, ksh2020) приводит к несовместимости скриптов между разными версиями.
  • Отсутствие активной поддержки: после ухода AT&T из проекта, разработка ksh93 замедлилась, и многие функции (например, поддержка Unicode) были добавлены только в 2023 году.
  • Меньшая популярность: по сравнению с bash, который является оболочкой по умолчанию в большинстве дистрибутивов Linux, ksh используется реже, что снижает количество доступных ресурсов и сообществ.

Источники

  • Korn, D. G. (1993). Korn Shell Programming. AT&T Bell Laboratories.
  • IEEE Std 1003.2-1992: Shell and Utilities.
  • Официальная документация ksh93 (AT&T Research).
  • Страница проекта mksh (MirBSD).
  • Статья «Korn shell» в англоязычной Википедии (версия от 2024 года).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →