Под открытым небом тот, о котором я слышал: http://www.unixmen.com/alfresco-an-opensource-alternative-of-microsoft-sharepoint/
Я буду придерживаться возможностей сценариев. Богатые интерактивные возможности (редактирование командной строки, завершение, подсказки и т.д.) имеют тенденцию быть очень разными, достигая схожих эффектов совершенно несовместимыми способами. Какие функции есть в 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.
Шаблоны 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.
[[ ... ]]
Синтаксис двойных скобокСинтаксис двойных скобок из 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}" ]
.
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 globbingKsh93 имеет 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
.
Этот вопрос довольно широкий.
Оба 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.
В последние годы в последних годах было определенное количество кроссовера в расширениях, однако. 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, проверьте, проверьте все! Используйте кодовые контракты, чтобы гарантировать правильные результаты каждый раз!