Я уже некоторое время являюсь пользователем Bash. Теперь я хочу изучить хотя бы еще одну оболочку, поэтому я выбрал Korn Shell. Однако, похоже, что Ksh не обновлялся в течение почти двадцати лет, и я читал, что Zsh включает в себя функции из него. Я прочитал много вопросов о сравнении оболочек в сети StackExchange, но не нашел ответа на этот:Есть ли функции Korn Shell, которые не реализованы в Zsh?Если так, то кто они?
решение1
ВотСтатья в Википедии о сравнении командных оболочек.
Согласно этому, единственная функция, которой обладает ksh, но которой нет у zsh, этоИменованные параметрыдля определяемых пользователем "типов". Могут быть и другие, поскольку эта статья не является исчерпывающим списком, особенно для малоизвестных функций.
Двигаясь в другом направлении, ответ на ваш вопрос мог бы заполнить целую книгу (возможно,Вот этот).
Zsh имеет много функций, которых нет у ksh. Несколько популярных из них:стек команд,стек каталогов,история обменаиrprompt.
- Стек командэто когда вы вводите команду и понимаете, что сначала нужно запустить другую команду. Просто отправьте текущую строку в стек команд, запустите другую команду, а затем вытащите команду из стека. Вы можете сделать это несколько раз. (zsh — единственная известная мне оболочка, которая это обеспечивает).
- Стек каталогов(он же
pushd
/popd
) — это когда вы хотите последовательно перейти в каталоги, а затем вернуться в обратном порядке. (Многие оболочки предоставляют такую возможность, включая bash). - История обменагде каждая открытая оболочка разделяет одну общую историю. Выполните команду в одном окне, переключитесь в другое, и она будет доступна в вашей истории.
- rpromptэто то же самое, что и ваш запрос, только он выровнен по правому краю. Многие любят ставить
cwd
ordate
вrprompt
.
Вот некоторые обсуждения zsh на сайтах Stack Exchange:
решение2
ksh88, наиболее известный вариант, поскольку он был включен в SVR4, bash
на котором в основном основан язык, частично клонированный pdksh, и чье подмножество является основой для спецификации POSIX, sh
не претерпел значительных изменений (за исключением некоторых исправлений ошибок и выравнивания POSIX некоторыми поставщиками) с момента своего последнего выпуска в мае 1993 года (ksh88i).
Однако ksh93, переписанный Дэвидом Корном, впервые выпущенный в декабре 1993 года, находился в активной разработке примерно до 2014 года, а его исходный код былосвобожденныйв 2000 году. Последний официальный релиз, ksh93u+, был выпущен в августе 2012 года (всего через несколько недель после того, как вы задали этот вопрос), а в 2014 году была выпущена «бета»-версия (ksh93v-), выпущенная первоначальными авторами после того, как они были уволены AT&T, со множеством новых функций.
Сообщество предприняло усилия по продолжению разработки и модернизации кода на основе ksh93v-, что привело к появлению ksh2020, ноэти усилия теперь прекращены. Аотдельные усилия по поддержанию ksh93u+после этого, кажется, все идет по тому же пути. В то время какновый (ksh93u+m)На данный момент ситуация выглядит более многообещающей.
ksh93 — это/было больше, чем просто оболочка. Он был разработан вместе с целым рядом утилит, повторно использующих часть того же кода, и это можно было сделать встроенным в ksh93, немного похоже на busybox.
Обратите внимание, что это было скорееисследоватьусилия, часто считается экспериментальным и очень плохо документирован.
Хотя zsh
изначально он был разработан как мощная интерактивная оболочка, фокус ksh93 был больше как язык программирования. Было приложено много усилий к языку и оптимизации с целью попасть в похожую категорию, например, или perl
.python
Есть много-много функций ksh93, которых нет в zsh, как и много-много функций zsh, которых нет в ksh93, и оба заимствовали функции друг у друга. Есть большой набор общих функций, и есть вещи, которые оба могут делать, но очень по-разному.
Вот некоторые вещи, которые есть в ksh93, но отсутствуют в zsh:
- все встроенные функции ast-open:
ksh93
при сборке как части ast-open имеет множество встроенных функций, которых нет в zsh, включая улучшенные версии некоторых стандартных утилит, таких какdate
,join
,head
,tr
,uniq
,wc
... (хотя zsh имеет некоторые из их функций в своих собственных встроенных функциях или языковых функциях). Этооптимизациясторона вещей. Вы не можете бытьperl
-типа, если вам нужно разветвить процесс, чтобы что-то сделать. - Подстановки команд без разветвления (
$(...)
) и подстановки команд, не создающие среду подоболочки${ ...; }
. - многомерные массивы:
a=((a b) (c d))
- Возможности объектно-ориентированного программирования (типы, структуры, дисциплины, методы...).
- статическая область видимости для переменных и опций (
zsh
имеетprivate
для переменных, но не имеет статической области видимости для опций). - ссылки на имена (важны для оболочек со статической областью действия и структурами объектного программирования, но не так важны для оболочек с динамической областью действия, таких как zsh или bash)
- Манипулирование датой/временем, в том числе с использованием естественного языка, crontab, iso-форматов в его
printf
встроенныхdate
функциях ( по сравнению с этимzsh
's весьма ограничен).strftime
- несколько полезных операторов перенаправления (
<#((...))
для поиска,<>;
перезаписи и усечения...). - пространства имен
- пулы рабочих мест и кошеллы.
- Кодирование/декодирование CSV/URI/HTML-сущностей/base64.
- кодирование/декодирование json в ksh93v - для (де)сериализации его расширенных структур данных в формате, который могут понять другие инструменты (очень глючный, удален в ksh2020).
$"..."
для локализации сообщений/dev/tcp
,/dev/udp
(zsh
имеетztcp
,zsocket
для сокетов домена UNIX, но не UDP)- Также в 90-х годах существовала
dtksh
оболочка, которая добавляла функциональность X toolkit к ksh93, включенному в CDE. - есть
shcomp
ккомпилироватькод кш.