Где zsh и mksh являются несовместимыми с ударом?

Под открытым небом тот, о котором я слышал: http://www.unixmen.com/alfresco-an-opensource-alternative-of-microsoft-sharepoint/

11
02.10.2014, 20:20
4 ответа

Я буду придерживаться возможностей сценариев. Богатые интерактивные возможности (редактирование командной строки, завершение, подсказки и т.д.) имеют тенденцию быть очень разными, достигая схожих эффектов совершенно несовместимыми способами. Какие функции есть в zsh и отсутствуют в bash, или наоборот? дает несколько указателей на интерактивное использование.

Ближе всего к bash будет ATT ksh93 или mksh (оболочка Korn и ее клон). Zsh также имеет набор функций, но вам придется запускать его в режиме эмуляции ksh, а не в родном режиме zsh.

Я не буду перечислять POSIX возможности (которые доступны в любой современной оболочке sh), относительно малоизвестные возможности, а также, как упоминалось выше, возможности для интерактивного использования. Наблюдения справедливы для bash 4.2, ksh 93u и mksh 40.9.20120630, установленных в Debian wheezy.

Синтаксис оболочки

Цитирование

$'...' (литеральные строки с интерполяцией обратной косой чертой) доступен в ksh93 и mksh. `$"..." (переведенные строки) специфичен для bash.

Условные конструкции

Mksh и ksh93 имеют ;& для перебора в операторе case, но не ;;& для проверки последующих случаев. В Mksh для этого есть ;|, а недавний mksh позволяет ;;& для совместимости.

((...)) арифметические выражения и [[ ... ]] тесты - это особенности ksh. Некоторые условные операторы отличаются, см. "Условные выражения" ниже.

Сопроцессы

В Ksh и bash есть сопроцессы, но они работают по-разному.

Функции

Mksh и ksh93 поддерживают синтаксис имя функции {...} для определения функций в дополнение к стандартному имя () {...}, но использование функция в ksh изменяет правила скопирования, поэтому для сохранения совместимости придерживайтесь имя () .... Правила для допустимых символов в именах функций различны; придерживайтесь буквенно-цифровых символов и _.

Расширение скобок

Ksh93 и mksh поддерживают расширение скобок {foo,bar}. Ksh93 поддерживает числовые диапазоны {1..42}, а mksh - нет.

Расширение параметров

Ksh93 и mksh поддерживают извлечение подстроки с помощью ${VAR:offset} и ${VAR:offset:length}, но не преобразование регистра, как ${VAR^}, ${VAR,} и т.д. Вы можете выполнить преобразование регистра с помощью typeset -l и typeset -u как в bash, так и в ksh.

Они поддерживают замену на ${VAR/PATTERN/STRING} или ${VAR/PATTERN//STRING}. Правила цитирования для STRING немного отличаются, поэтому избегайте обратных слешей (и, возможно, других символов) в STRING (создайте переменную и используйте ${VAR/PATTERN/$REPLACEMENT} вместо этого, если замена содержит символы цитирования).

Расширение массива (${ARRAY[KEY]}, "${ARRAY[@]}", ${#ARRAY[@]}, ${!ARRAY[@]}) работают в bash как в ksh.

${!VAR} расширяется до ${OTHERVAR}, когда значением VAR является OTHERVAR (косвенная ссылка на переменную) - это специфично для bash (ksh делает что-то другое с ${!VAR}). Чтобы получить такое двойное расширение в ksh, нужно использовать вместо этого ссылку на имя (typeset -n VAR=OTHERVAR; echo "$VAR"). ${!PREFIX*} работает так же.

Подстановка процессов

Подстановка процессов <(...) и >(...) поддерживается в ksh93, но не в mksh.

Wildcard patterns

Шаблоны ksh extended glob, которые требуют shopt -s extglob для активации в bash, всегда доступны в ksh93 и mksh.

Mksh не поддерживает символьные классы, такие как [[:alpha:]]].

Перенаправление ввода-вывода

Bash и ksh93 определяют псевдофайлы /dev/tcp/HOST/PORT и /dev/udp/HOST/PORT, а mksh - нет.

Расширение подстановочных знаков в перенаправлении в скриптах (как в var="*.txt"; echo hello >$a запись в a.txt, если это имя файла является единственным совпадением шаблона) является специфической особенностью bash (другие оболочки никогда не делают этого в скриптах).

<<< here-строки работают в ksh так же, как в bash.

Ярлык >& для перенаправления синтаксических ошибок также поддерживается mksh, но не ksh93.

Conditional expressions

[[ ... ]] Синтаксис двойных скобок

Синтаксис двойных скобок из ksh поддерживается как ATT ksh93, так и mksh, как в bash.

Файловые операторы

Кш93, mksh и bash поддерживают одни и те же расширения POSIX, включая -a как устаревший синоним -e, -k (sticky), -G (владелец egid), -O (владелец euid), -ef (тот же файл), -nt (новее чем), -ot (старше чем).

-N FILE (изменен с момента последнего чтения) не поддерживается mksh.

Mksh не имеет оператора соответствия regexp =~. Ksh93 имеет этот оператор, и он выполняет такое же сопоставление, как и в bash, но не имеет эквивалента BASH_REMATCH для последующего извлечения сопоставленных групп.

Строковые операторы

Ksh93 и mksh поддерживают те же операторы сравнения строк < и >, что и bash, а также ==, синоним =. Mksh не использует настройки локали для определения лексикографического порядка, он сравнивает строки как байтовые строки.

Другие операторы

-v VAR для проверки того, определена ли переменная, специфичны для bash. В любой оболочке POSIX вы можете использовать [ -z "${VAR+1}" ].

Builtins

alias

Набор допустимых символов в именах псевдонимов не одинаков во всех оболочках. Я думаю, что он такой же, как и для функций (см. выше).

builtin

В Ksh93 есть встроенная команда builtin, но она не выполняет имя как встроенную команду. Используйте command, чтобы обойти псевдонимы и функции; при этом будет вызвана встроенная команда, если она существует, иначе - внешняя команда (этого можно избежать с помощью PATH= command error_out_if_this_is_not_a_builtin).

caller

Это специфично для bash. Вы можете получить похожий эффект с помощью .sh.fun, .sh.file и .sh.lineno в ksh93. В mksh наконец-то есть LINENO.

declare, local, typeset

declare - это специфическое для bash имя для typeset из ksh. Используйте typeset: он также работает в bash.

Mksh определяет local как псевдоним для typeset. В ksh93 нужно использовать typeset (или определить псевдоним).

В Mksh нет ассоциативных массивов (они планируются в пока еще не вышедшей версии).

Не думаю, что в ksh есть точный эквивалент bash'овской typeset -t (функция трассировки).

cd

В кш93 нет -e.

echo

Ksh93 и mksh обрабатывают опции -e и -n, как в bash. Mksh также понимает -E, ksh93 не рассматривает его как опцию. Расширение обратной косой черты выключено по умолчанию в ksh93, включено по умолчанию в mksh.

enable

Ksh не предоставляет возможности отключения встроенных команд. Чтобы избежать встроенной команды, найдите путь внешней команды и вызовите ее явно.

exec

В Ksh93 есть -a, но нет -l. У Мкш нет ни того, ни другого.

export

Ни в ksh93, ни в mksh нет export -n. Вместо этого используйте typeset +x foo, это работает в bash и ksh.

Ksh не экспортирует функции через окружение.

let

let одинаков в bash и ksh.

mapfile, readarray

Это специфическая для bash функция. Вы можете использовать циклы while read или подстановку команд для чтения файла и разбиения его на массив строк. Позаботьтесь о IFS и globbing. Вот эквивалент mapfile -t lines :

IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f

printf

printf - очень похоже. Я думаю, что ksh93 поддерживает все директивы формата bash. mksh не поддерживает %q или %(DATE_FORMAT)T; на некоторых установках printf не является встроенной командой mksh и вместо нее вызывает внешнюю команду.

printf -v VAR специфичен для bash, ksh всегда печатает на стандартный вывод.

read

Несколько опций специфичны для bash, включая все опции readline. Опции -r, -d, -n, -N, -t, -u идентичны в bash, ksh93 и mksh.

readonly

Вы можете объявить переменную только для чтения в кш93 и мкш с помощью одинакового синтаксиса. Если переменная является массивом, то сначала нужно присвоить ей значение, а затем сделать ее доступной только для чтения с помощью readonly VAR. Функции нельзя сделать доступными только для чтения в ksh.

set, shopt

Все опции к set и set -o являются функциями POSIX или ksh.

shopt специфичен для bash. Многие опции в любом случае касаются интерактивного использования. О влиянии на globbing и другие возможности, включаемые некоторыми опциями, см. раздел "Опции" ниже.

source

Этот вариант существует и в ksh. В bash и mksh, source ищет текущий каталог после PATH, но в ksh93 это точный эквивалент . .

ловушка

Псевдосигнал DEBUG не реализован в mksh. В ksh93 он существует с другим способом сообщения информации, подробности см. в руководстве.

type

В ksh, type является псевдонимом для whence -v. В mksh type -p выводит не путь к исполняемому файлу, а человекочитаемое сообщение; вместо него нужно использовать whence -p COMMAND.

Опции

shopt -s dotglob - не игнорировать точечные файлы в globbing

Чтобы эмулировать опцию dotglob в ksh93, вы можете установить FIGNORE='@(.|...)'. Я не думаю, что в mksh есть что-то подобное.

shopt -s extglob - ksh extended glob patterns

Опция extglob фактически всегда включена в ksh.

shopt -s failglob - ошибка, если шаблон glob не соответствует ничему

Я не думаю, что это существует в mksh или ksh93. В zsh это есть (поведение по умолчанию, если не установлены null_glob или csh_null_glob).

shopt -s globstar - **/ recursive globbing

Ksh93 имеет recursive globbing с **/, включенный с помощью set -G. Mksh не имеет рекурсивного глоббинга.

shopt -s lastpipe - запуск последней команды конвейера в родительской оболочке

Ksh93 всегда запускает последнюю команду конвейера в родительской оболочке, что в bash требует установки опции lastpipe. Mksh всегда запускает последнюю команду конвейера во вложенной оболочке.

shopt -s nocaseglob, shopt -s nocasematch - нечувствительные к регистру шаблоны

В Mksh нет нечувствительного к регистру сопоставления шаблонов. Ksh93 поддерживает его для каждого шаблона отдельно: префикс шаблона ~(i).

shopt -s nullglob - расширение шаблонов, которые не соответствуют ни одному файлу, до пустого списка

У Mksh этого нет. Ksh93 поддерживает это для каждого шаблона отдельно: префикс шаблона с ~(N).

Переменные

Очевидно, что большинство переменных BASH_xxx не существует в ksh. $BASHPID может быть эмулирован с помощью дорогостоящей, но портативной sh -c 'echo $PPID', и недавно был добавлен в mksh. BASH_LINE - это .sh.lineno в ksh93 и LINENO в mksh. BASH_SUBSHELL - это .sh.subshell в ksh93.

Mksh и ksh93 при запуске используют файл, указанный в ENV.

EUID и UID не существуют в ksh93. Мкш называет их USER_ID и KSH_UID; у него нет GROUPS.

FUNCNAME и FUNCNEST не существуют в ksh. В кш93 есть .sh.fun и .sh.level. Функции, объявленные с помощью function foo { ...; } (без скобок!), имеют собственное имя в $0.

GLOBIGNORE существует в ksh93, но с другим именем и синтаксисом: он называется FIGNORE, и это один шаблон, а не список, разделенный двоеточием. Используйте шаблон @(...|...). FIGNORE в Ksh превосходит FIGNORE в bash, но имеет совершенно другой синтаксис.

Ksh93 и mksh не имеют ничего похожего на HOSTTYPE, MACHTYPE и OSTYPE. А также SHELLOPTS или TIMEFORMAT.

У Mksh есть PIPESTATUS, а у ksh93 нет.

Mksh и ksh93 имеют RANDOM.

19
27.01.2020, 19:57

Этот вопрос довольно широкий.

Оба MKSH и ZSH являются оболочками, которые поддерживают множество GNU Bash -Specivers, но всегда есть некоторые, которые не поняты.

ZSH поддерживает больше вещей, но только в своем родном режиме ZSH, который не совместим с SCIX Shells (например, GNU Bash, AT & T KSH93 , MKSH). Кроме того, MKST гораздо более легкий и бывший и более портативный.

В целом, если это Ваш скрипты, о которых мы говорим, идите вперед, просто проверьте их. (MKSH еще не поддерживает ассоциативные массивы Bash4-Style. Команда «Объявления» - это специфическое от Bash, «Набор» - это эквивалент. Я недостаточно знакомо, что ZSH не имеет ничего об этом. KSH93 не имеет «местного» Но также использует «набор» для этого.) Но если это о том, скажем, бегая забавную систему Debian, забудьте. Существование Bash является частью «обещания» (API / ABI системы), и многое полагается на нее.

Отказ от ответственности: Я разработчик MKSH.

4
27.01.2020, 19:57

ZSH Сравнение раковин

В последние годы в последних годах было определенное количество кроссовера в расширениях, однако. ZSH (по состоянию на 3.1.6) имеет функцию Bash's $ {var / stef / new} для замены текста старого текста, нового в параметре $ var. Обратите внимание, что одна разница здесь: в то время как оба оболочки реализуют синтаксис $ {var / # старый / новый} 'и $ {var /% old / new}' для закрепления матча старого до начала или конца Текст параметра, соответственно, в ZSH вы не можете поместить # 'или %' внутри параметра: другими словами {var / $ alt / new} ', где старый начинается с # «относится к этому как обычный характер в ZSH, в отличие от Bash. Сделать такую ​​вещь в ZSH, вы можете использовать (с 3.1.7) новый синтаксис для анкеров в любом шаблоне, (# S) », чтобы соответствовать началу строки и` (#e) Сопоставьте конец. Для этого требуется параметр Extended_Glob.

Я самый незнаком с MKSH, поэтому я не знаю, где искать этот ответ.

Если вы ищете безопасную замену для Shell, ни одна из этих снарядов не отличается от Bash, насколько присущный недостаток, который вы обсуждаете.

Язык, такой как Perl обрабатывает входы более безопасно. Но ремонтность также здесь ключ. Замена раковины Perl не очень хорошо принята. Это ответственность сопровождающего оболочки, чтобы надежно обрабатывать вклад. Поэтому, когда вы пишете скрипты, Validate, проверьте, проверьте все! Используйте кодовые контракты, чтобы гарантировать правильные результаты каждый раз!

Perl Shell

Заявление FSF по шкалу оболочки

1
27.01.2020, 19:57

Одной из функций , не включенной по умолчанию в mksh, является история оболочки.

  • В вашем .mkshrcпросто установите:

    export HISTFILE=~/.mksh-history

0
27.01.2020, 19:57

Теги

Похожие вопросы