Разработка сценариев для межплатформенного развертывания
По большей части, сценарии, работающие на других основанных на UNIX или подобных UNIX платформах (Linux, например) также выполненный правильно на OS X и наоборот. Существуют различия, как бы то ни было.
В дополнение к нахождению тонких изменений в иерархии файловой системы и поведении общих инструментов командной строки, Вы также сочтете различные инструменты и технологии для устройства I/O и для добавления и удаления пользователей и групп.
Версия оболочки Bourne
OS X обеспечивает BASH как свою реализацию Оболочки Bourne. Когда выполняется как /bin/sh
, это должно быть полностью совместимо с другими реализациями. Однако иногда различия могут возникнуть. То же верно для других операционных систем, использующих BASH или ZSH как их реализация Оболочки Bourne.
Для максимальной совместимости необходимо тщательно избегать использования любых СПЕЦИФИЧНЫХ ДЛЯ BASH расширений в сценариях оболочки. Если Вы не можете избежать расширений BASH, необходимо явно заставить сценарий выполниться в BASH путем изменения первой строки на следующее:
#!/bin/bash |
Необходимо использовать подобную первую строку для сценариев записанное использование расширения ZSH.
Межплатформенные окончания строки
Различные операционные системы используют различные символы для указания конца каждой строки в текстовых файлах. Это может вызвать странное и необычное поведение, если Вы не ожидаете его:
Инструменты командной строки в OS X (и другой UNIX или варианты Linux) используют окончания строки стиля UNIX. Это означает, что каждая строка в текстовом файле заканчивается символом новой строки (символ
10
/0xA
, часто сокращаемый LF).Много более старых приложений Mac используют окончания строки "стиля Mac”. Это означает, что каждая строка в текстовом файле заканчивается символом возврата каретки (символ
13
/0xD
, часто сокращаемый CR).Когда обработано с утилитами командной строки в UNIX или вариантах Linux, файлы с устаревшими окончаниями строки стиля Mac обнаруживаются как одна строка на экране; как каждая строка, распечатанная на экран, это перезаписывает предыдущую строку. Это вызвано тем, что UNIX и Linux перемещают курсор в левый край экрана, когда они встречаются с возвратом каретки, но не перемещают курсор вниз строка.
Приложения Windows и много сетевых служб используют окончания строки стиля Windows. Это означает, что каждая строка в текстовом файле заканчивается и возвратом каретки и переводом строки (символ
13
/0xD
сопровождаемый символом10
/0xA
, часто сокращаемый CR/LF или CRLF).Когда обработано с утилитами командной строки в UNIX или вариантах Linux, содержание с окончаниями строки стиля Windows выглядит правильным, но может вести себя неожиданными способами вследствие дополнительного возврата каретки в конце каждой строки. Например, дополнительный возврат каретки может встревожить поведение разделения в awk, может вызвать образцы, использующие привязку конца строки в регулярных выражениях для сбоя и т.д.
Иногда, можно также встретиться с файлом, заканчивающимся новой строкой, сопровождаемой возвратом каретки (реверс окончаний строки Windows, сократил LF/CR или LFCR).
Когда обработано с утилитами командной строки в UNIX или вариантах Linux, как с окончаниями строки стиля Windows, все будет казаться правильным, но Вы получите странное поведение, включая полевые проблемы разделения, неправомерное поведение образцов, содержащих привязку запуска из строки в регулярных выражениях, и т.д.
Это обычно прямо, чтобы обнаружить строку конечный тип текстового файла и считать его правильно. Следующий фрагмент кода демонстрирует один путь:
Окончания строки Преобразования перечисления 10-1 к новым строкам стиля UNIX
TYPE="$(file "$1" | sed 's/.*with //' | sed 's/ .*//')" |
if [ "$TYPE" = "CR" ] ; then |
DATA="$(tr '\r' '\n' < "$1")" |
else |
# Most versions of the "file" command can't detect |
# LFCR line endings, so do this even if the file |
# appears to have UNIX line endings. |
DATA="$(tr -d '\r' < "$1")" |
fi |
Преобразование между этими форматами также относительно просто, как только Вы решили, что необходимо сделать так.
Преобразование перечисления 10-2 между форматами окончания строки
Работа с устройством I/O
OS X использует Набор I/O для драйверов устройств. В отличие от большинства основанных на UNIX и подобных UNIX операционных систем, большинство устройств не представлено через файлы устройств в /dev
. (Диски и последовательные порты являются существенными исключениями.)
В целом устройство I/O должно быть записано на языке C-derived с помощью функциональности в платформе Набора I/O. Однако, если Вы пишете свой собственный драйвер устройства, можно представить файл устройств в /dev
при желании.
См. Основные принципы IOKit для получения общей информации, Получая доступ к Аппаратным средствам Из Приложений, чтобы изучить, как записать приложение в драйверы устройства доступа от пространства пользователя или Руководство по программированию Ядра, чтобы изучить, как поддерживать файлы устройств и ioctl
системный вызов в ядре.
Иерархия файловой системы
Много файлов находятся в различных местах в OS X, чем в других операционных системах. Для получения дополнительной информации о расположении OS X, считайте Обзор Файловой системы. Для получения дополнительной информации о других операционных системах, считайте следующее:
hier
— Страница руководства OS X hier (7) описывает иерархию файловой системы OS X.http://www.FreeBSD.org/cgi/man.cgi? query=hier&sektion=7 — страница руководства FreeBSD
hier(7)
описывает иерархию файловой системы FreeBSD. Это подобно иерархии, используемой большинством основанных на BSD операционных систем. (Нет, написание раздела не является опечаткой.)http://www .pathname.com/fhs/— Стандарт Иерархии Файловой системы описывает иерархию файловой системы, используемую основанными на Linux операционными системами, и получен из иерархии, используемой AT&T основанные на UNIX операционные системы.
http://h20000.www2.hp.com/bc/docs/support/SupportManual/c02255645/c02255645.pdf — Это приложение из документации HP-UX описывает иерархию AT&T основанные на UNIX операционные системы.
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp? тема =/com.ibm.aix.baseadmn / doc/baseadmndita/fs_tree_org.htm — Эта страница в IBM pSeries и Информационном центре ЭКС-АН-ПРОВАНСА описывает иерархию ЭКС-АН-ПРОВАНСА.
Задачи системного администрирования
Этот раздел обеспечивает обзор нескольких задач администрирования общей системы. Полный обзор задач системного администрирования выходит за рамки этого документа. Для более полной обработки считайте Введение в администрацию Командной строки в http://manuals .info.apple.com/en_US/IntroCommandLine_v10.6.pdf.
Управление пользователями и группами
В конфигурации по умолчанию OS X пользователи и группы не сохранены в файле паролей на диске. Таким образом Вы не можете изменить файл паролей непосредственно.
OS X поддерживает много хранилищ данных для пользователя и информации о группе, включая LDAP и плоские файлы. В зависимости от конфигурации пользователи могли потенциально быть сохранены локально или удаленно и получены доступ через любой из этих методов. Таким образом, для добавления пользователей и групп через сценарии оболочки общим способом необходимо использовать утилиту командной строки Службы каталогов, dscl
(или Служба каталогов API, на котором та утилита базируется).
Поскольку dscl
инструмент является определенным для OS X, если Вы пишете сценарии для межплатформенного развертывания, необходимо протестировать на его существование и отступить к традиционной модификации файла паролей, если это не там. Чтобы изучить, как сделать это, читайте если Оператор.
Для узнавания больше об управляющих пользователях и группах из командной строки считайте Введение в администрацию Командной строки в http://manuals .info.apple.com/en_US/IntroCommandLine_v10.6.pdf.
Для узнавания больше о записях Службы каталогов на высоком уровне читайте, Открывать Directory Programming Guide. Чтобы изучить, как использовать утилиту командной строки Службы каталогов для изменения тех записей, прочитайте страницу руководства для dscl
.
Чтобы видеть, как вручную добавить нового пользователя из командной строки, считайте главу Дополнительных функций Портирования Приложений UNIX/Linux к OS X. Для сценариев, чтобы помочь Вам добавить новых пользователей и группы программно, посмотрите Управление пользователями и Групповое управление в главе Начальных точек этого документа.
Управление списком управления доступом (ACL)
Некоторые основанные на UNIX и подобные UNIX операционные системы обеспечивают setfacl
, chacl
, или acledit
/aclget
/aclput
для установки файла и каталога ACLs. OS X не делает. Вместо этого OS X обеспечивает файл модификация ACL через chmod
команда.
К сожалению, нет никакого стандартизированного синтаксиса для получения и установки ACLs на командной строке (ни даже стандартный набор поддерживаемых прав через операционные системы). В настоящее время единственный способ переносимо обработать ACLs состоит в том, чтобы избежать их полностью или потребовать, чтобы Ваши пользователи записали специфичный для OS плагин.
Если необходимо использовать ACLs в межплатформенном сценарии, Вы должны особый случай код на основе на OS. Самый простой способ сделать это должно использовать вывод uname
команда. (См. uname
страница руководства для получения дополнительной информации.)
Управление дисками и разделение
Управление дисками и инструменты разделения значительно различаются от одного основанного на UNIX или подобного UNIX OS до следующего. Это непрактично для этого документа для покрытия предмета подробно.
Для получения информации о других основанных на UNIX и подобных UNIX операционных системах хорошее место для запуска является Руководством Системного администрирования UNIX Nemeth и другими.
Для получения информации об инструментах командной строки OS X для управления дисками и разделения, считайте Введение в администрацию Командной строки в http://manuals .info.apple.com/en_US/IntroCommandLine_v10.6.pdf и посмотрите раздел 8 из Страниц справочника OS X. В частности необходимо смотреть на страницы справочника для hdiutil
, pdisk
, fdisk
, gpt
, и diskutil
.
Общие различия в инструменте командной строки
Много инструментов командной строки ведут себя по-другому через различные основанные на UNIX и подобные UNIX операционные системы. Эта глава объясняет некоторые основные отличия в тех инструментах.
Основанные на UNIX и подобные UNIX операционные системы обычно попадают в один из трех лагерей:
AT&T UNIX: Также известный как System V UNIX (в ее последнем воплощении), AT&T UNIX был исходной операционной системой UNIX. Его потомки включают большинство операционных систем, обычно упоминающихся как UNIX.
BSD: Короткий для Распределения программного обеспечения Беркли, BSD является именем, данным семье операционных систем, убывавших от дериватива UNIX, первоначально распределенного Калифорнийским университетом, Беркли, в 1970-х.
За эти годы распределение Беркли и распределение AT&T продолжали отличаться. Результат состоит в том, что существует много тонких различий в синтаксисе между сценариями оболочки, записанными для систем, следующих за семантикой AT&T по сравнению с теми, которые следуют за семантикой BSD.
В 1990-х BSDi (коммерческая компания сформировалась в результате исследования Беркли UC) выпустил операционную систему BSD как открытый исходный код. Большинство современных операционных систем BSD получено из этой исходной основы, известной как 4.4BSD-облегченный выпуск 2.
Из-за лицензионных ограничений на исходном исходном коде UNIX части, первоначально записанные AT&T, должны были быть переписаны в соответствии с более разрешающей лицензией для выпуска его как открытого исходного кода. Это внесло далее в различия в синтаксисе между основанным на BSD и AT&T основанные на UNIX операционные системы.
Linux и GNU: В течение 1990-х родилась новая операционная система, Linux. При объединении ядра, записанного Линусом Торволдсом и многими утилитами, записанными Фондом свободного программного обеспечения (FSF) для их собственного проекта операционной системы (GNU Херд), эта операционная система быстро превратилась в очень важную третью подобную UNIX операционную систему.
Добавление к важности Linux и инструментов GNU было появлением МАКБСДА, FreeBSD, NetBSD, OpenBSD и других вариантов BSD. Несмотря на то, что основанные на BSD операционные системы имели много общих утилит, у них не было замен для нескольких недостающих частей AT&T. Поэтому многие из этих инструментов также превратили свой путь в эти основанные на BSD операционные системы. Похожим способом полученные из BSD инструменты часто появляются как часть дистрибутивов Linux.
За эти годы много стандартов появились для смягчения различий в синтаксисе между этими операционными системами, включая POSIX и Single Unix Specification (SUS). Как работа для операционных систем соответствия с этими спецификациями, многие различия в синтаксисе постепенно исчезают в неуместность. Однако для истинной межплатформенной совместимости, необходимо все еще знать об этих различиях.
OS X до версии 10.5 обеспечил инструменты, обычно следующие за семантикой BSD (или, в некоторых случаях, Linux или семантика GNU). При начале в OS X v10.5, многие из этих инструментов вместо этого повинуются семантике AT&T (большую часть времени; посмотрите примечание ниже для исключений). Таким образом некоторые инструменты ведут себя по-другому в зависимости от версии OS X. Эти различия описаны в страницах руководства для отдельных инструментов.
awk
В операционных системах, следующих за семантикой AT&T, awk
команда поддерживает определенные формы расширенных регулярных выражений (такой как {n,m}
, [[==]]
, и [[..]]
) явно не устанавливая флаги для включения поддержки расширенного регулярного выражения. Поскольку это поведение не является переносимым, Вы не должны зависеть от него.
Из-за этого различия, если Вы находите регулярное выражение что деталь awk
интерпретатор не может обработать, необходимо сначала попытаться включить поддержку расширенного регулярного выражения и затем видеть, уходит ли проблема. Это будет обычно повреждать другие части выражения, как бы то ни было. Если так, необходимо переписать регулярное выражение, чтобы полностью использовать синтаксис расширенного регулярного выражения.
Для приобретения знаний об основных и расширенных регулярных выражениях считайте Освобожденные Регулярные выражения. Узнать больше awk
интерпретатор, прочитанный страница руководства для awk
. Для узнавания больше о языке сценариев AWK читайте Как Неловкий.
chown
Если Вы передаете -P
флаг к chown
, это не идет по символьным ссылкам. Таким образом файл, на который указывает символьная ссылка, никогда не изменяется, если Вы указываете -P
флаг.
Однако в операционных системах, следующих за семантикой AT&T, когда Вы даете команду chown -RP directory_name
, идентификатор пользователя самой символьной ссылки изменяется. В операционных системах, следующих за семантикой BSD, не изменяется сама символьная ссылка.
CP
Если Вы передаете обоих -i
и -f
флаги к cp
, имеющий приоритет флаг варьируется среди операционных систем. Эти флаги указывают противоположное поведение, таким образом, Вы никогда не должны использовать их вместе.
Кроме того, -f
опция имеет различное поведение в зависимости от операционной системы:
Флаги | Семантика BSD | Семантика AT&T |
---|---|---|
| Целевые неизменные полномочия файла. | Целевой набор полномочий файла к полномочиям по умолчанию. |
| Целевой набор полномочий файла к полномочиям исходного файла. | Целевой набор полномочий файла к полномочиям исходного файла. |
Наконец, в операционных системах, следующих за семантикой AT&T при копировании рекурсивно, остановки работы копии, как только происходит любая ошибка. В операционных системах, следующих за семантикой BSD, работа копии завершается до максимальной возможной степени. В любом случае команда выходит с ненулевым кодом результата.
Если необходимо гарантировать, что работа копии не останавливается при первом отказе, можно использовать tar
вместо этого. Для примера того, как использовать tar
для копирования файлов посмотрите Анонимные Подпрограммы.
crontab
В системах UNIX AT&T-based, crontab
команда читает из стандартного ввода по умолчанию, но в основанных на BSD системах, это не делает. Для межплатформенной совместимости необходимо указать дефис (-
) для имени файла вместо этого. Это продолжает работать с версиями crontab
это повинуется и AT&T и семантике BSD.
дата
Коды результата, возвращенные date
варьируйтесь в зависимости от операционной системы. Для межплатформенной совместимости можно только предположить что код результата нуля (0
) указывает успех, и любое другое значение указывает своего рода отказ.
df
df
команда имеет два различных значения для -t
флаг, начинающийся в OS X v10.5. Они следующие:
Если Вы включаете значение впоследствии (например,
-t hfs
), это ведет себя как-T
флаг. Это использование осуждается.Без параметра говорит это
df
распечатать общую выделенную площадь. Поскольку эта опция является значением по умолчанию, этим использованием-t
флаг является ненужным.
Размер блока по умолчанию варьируется в различных операционных системах. Linux и большая часть основанного на BSD значения по умолчанию операционных систем к 1k размеру блока, в то время как AT&T основанное на UNIX значение по умолчанию операционных систем к 512-байтовому размеру блока.
Для непротиворечивого поведения через многократные операционные системы необходимо всегда указывать размер блока явно. Например, флаг-k указывает, что о размере блока нужно сообщить в килобайтах.
Наконец, полный процент, о котором сообщают df
может быть округлен по-другому в различных операционных системах.
dos2unix и unix2dos
Linux обеспечивает эти две утилиты для преобразования между стилем UNIX и окончаниями строки стиля DOS. Используя эти инструменты не является переносимым, и OS X не обеспечивает эти утилиты.
Вместо использования dos2unix
или unix2dos
, необходимо вместо этого использовать tr
или sed
как описано в Межплатформенных Окончаниях Строки.
du
Операционные системы, следующие за семантикой AT&T, позволяют Вам передавать комбинацию -L
, -H
, и -P
опции к du
. Последний флаг, с которым встречаются, определяет поведение команды. В операционных системах, следующих за семантикой BSD, указывая больше чем один из этих результатов опций по ошибке. Для решения этой проблемы удалите все кроме последней из этих опций.
Кроме того, много основанных на BSD операционных систем не могут обнаружить циклы символьной ссылки. Для межплатформенной совместимости Вы не должны обычно говорить du
пройти по символьным ссылкам, если Вы не уверены, что не могут произойти никакие циклы.
эхо
Особенно интересный различие в поведении echo
встроенный и соответствующая автономная команда. Если Вы хотите выпустить подсказку, в полученных из BSD операционных системах можно бросить запаздывающую новую строку путем ввода следующего:
echo -n "Prompt: " |
В AT&T полученные из UNIX операционные системы эквивалент:
echo "Prompt: \c" |
К сожалению, это различие делает очень трудным записать сценарии, зависящие от этого поведения межплатформенным способом. Для мобильности необходимо избежать любой из этих конструкций. Как альтернатива, можно или использовать printf
команда вместо echo
или используйте tr
команда для удаления новой строки.
Например, следующие строки обе печати «Подсказка “: сопровождаемый словом «новая строка» сразу позже на той же строке:
echo "Prompt: " | tr -d '\n'; echo "newline" |
printf "Prompt: "; printf "newline\n"; |
echo
команда также варьируется по способу, которым она обрабатывает escape-последовательности управляющего символа такой как \r
. Поскольку они обрабатываются по-другому в различных операционных системах, необходимо избегать использования их с echo
. Как альтернатива, используйте printf
команда, чтобы распечатать эти последовательности или сохранить желаемый управляющий символ в использовании переменной оболочки printf
или tr
.
Например, следующий код отправляет XON (Управление-Q) байт к стандартному выводу:
XON="$(echo 'x' | tr 'x' "\\021")" |
echo "Here is an XON: $XON" |
файл
file
команда имеет два переключателя, ведущие себя по-другому в различных операционных системах: -i
и -r
(или --raw
). Для непротиворечивого поведения необходимо избежать этих переключателей.
В AT&T основанные на UNIX операционные системы, -i
опция говорит file
команда для не классификации содержания регулярных файлов с помощью внешнего mime.types
файл. Это приводит к более быстрой производительности, но обеспечивает менее подробный анализ.
В полученных из BSD операционных системах, -i
флаг говорит file
команда для вывода сырых данных имитирует строки типа, а не более традиционные человекочитаемые. Для этого поведения необходимо использовать --mime
флаг вместо этого, хотя та опция также не поддерживается универсально.
-r
и --raw
опции поддерживаются только в полученных из BSD операционных системах. Эти флаги говорят команде файла не переводить непечатные символы в свои восьмеричные представления. Операционные системы AT&T-derived никогда не делают это.
grep
В некоторых операционных системах, grep
сбои тихо, при попытке соответствовать каре посреди строки, в то время как другие версии grep
предупредите об ошибке. Такое выражение не является юридическим регулярным выражением, конечно, но если Ваш сценарий зависит от получения ошибки в этом случае (или не получение ошибки), сценарий не является полностью переносимым.
голова
head
команда существует через большинство операционных систем. Однако различные версии обеспечивают несколько флагов, которые нестандартны.
Единственный флаг, который может использоваться переносимо, -n
флаг, берущий количество строки.
Большинство операционных систем (включая OS X) также поддерживает -c
флаг, указывающий количество байта, но эта поддержка, как гарантируют, не будет переносимой. Возможно эмулировать эту функциональность переносимо с помощью сценария AWK, однако, следующим образом:
Перечисление 10-3 , Эмулирующее главный-c использование AWK: 01_head_c.sh
#!/bin/sh |
# Usage: ./head_c filename bytecount |
FILENAME=$1 |
COUNT=$2 |
SCRIPT="$(mktemp '/tmp/head_c.XXXXXXXXXX')" |
cat << EOF > "$SCRIPT" |
BEGIN { |
FS=""; |
my_string = "" |
} |
{ |
my_string = my_string "\n" \$0; |
} |
END { |
# Start from character 2 to skip the bogus leading newline. |
print substr(my_string, 2, $COUNT); |
} |
EOF |
awk -f "$SCRIPT" "$FILENAME" |
rm "$SCRIPT" |
Можно также столкнуться с незначительной проблемой совместимости при портировании сценариев от Linux до OS X. Когда Вы передаете многократные имена файлов head
команда, это распечатывает строку заголовка для каждого имени файла в форме
==> filename <== |
Версия Linux head
обеспечивает a -q
флаг, отключающий печать маркера заголовка, даже если Вы указываете многократные файлы. Это также обеспечивает a -v
флаг, вызывающий печать заголовка, даже когда указан только один файл.
Как альтернатива -v
флаг, можно вывести маркер имени файла в сценарии с простым echo
оператор как этот:
echo "==> $FILENAME <==" |
Как альтернатива -q
флаг, при условии, что нет никакой возможности содержания Ваших файлов, фактически соответствующего образец, можно разделить маркеры с grep
как это:
head -n 1 file1 file2 ... | grep -v '^==>.*<==$' |
В дополнение к этим различиям во флаге POSIX указывает что входные файлы для head
должны быть допустимые текстовые файлы, что означает, что все последовательности байта должны быть допустимыми для текущей локали. Несмотря на то, что не все версии head
осуществите это ограничение, делающие версии могут перестать работать, когда используется с двоичными файлами в некоторых операционных системах, если Вы не изменяете локальные настройки.
Если Ваши сценарии должны обработать двоичные файлы, несомненно, укажут локаль «C» перед выполняющимися командами, работающими с этими двоичными файлами. Для изменения локали выпустите следующее утверждение:
соединение
-e
опция говорит join
команда для вставки указанной строки в пустые поля. В операционных системах, следующих за семантикой BSD, происходит замена, только при отсутствии непустых полей после пустого поля. В операционных системах, следующих за AT&T семантика UNIX, всегда происходит замена.
Не все join
флаги поддерживаются во всех операционных системах. Для мобильности необходимо ограничить себя -a
, -e
, -o
, -t
, -v
, -1
, и -2
.
меньше
Посмотрите более или менее.
ls
Когда -H
указан (и не переопределяется -L
или -P
) и аргумент файла является символьной ссылкой, решающей к файлу некаталога, вывод отражает природу ссылки, а не тот из файла. В операционных системах, следующих за семантикой BSD, вывод описывает файл.
-f
опция включает -a
опция (показывают файлы, имена которых имеют период (.
) как первый символ). В операционных системах, следующих за семантикой BSD, она не делает.
-o
опция заставляет перечисление быть в длинном формате, но опускать ID группы. В операционных системах, следующих за семантикой BSD, -o
опция изменяет -l
опция, заставляя флаги файла быть перечисленным.
-g
, -n
, и -o
опции включают -l
опция (то, чтобы заставлять перечисление быть в длинном формате). В операционных системах, следующих за семантикой BSD, они не делают.
mkfifo
В операционных системах, следующих за семантикой BSD, mkfifo
команда применяет маску 0666
к режиму, переданному в для -m
опция. В операционных системах, следующих за семантикой AT&T, не применяется никакая маска.
более или менее
Различные операционные системы обрабатывают -n
и -p
флаги к more
управляйте по-другому.
В операционных системах, следующих за BSD и семантикой AT&T, -n
опция указывает число строк на экран, и -p
опция позволяет Вам указывать команды (такой как :p
) для выполнения каждый раз, новый экранный из текста выведен на экран.
В операционных системах, следующих за семантикой Linux (и для less
команда во всех операционных системах), -n
флаг говорит more
команда к подавить нумерацию строк, и -p
флаг указывает поисковый образец.
mv
Если Вы говорите mv
команда для перемещения подкаталога в его текущий родительский каталог (путем ввода mv foo/bar foo
, например), поведение варьируется тонким способом. Никакое действие не происходит ни в какой операционной системе, потому что Вы эффективно перемещаете каталог поверх себя. Однако операционные системы, следующие за выходом семантики BSD с нулем (успех) код результата, тогда как операционные системы, следующие за семантикой AT&T, выводят на экран сообщение об ошибке и выход с ненулевым (отказ) код результата.
PR
В AT&T семантика UNIX последнее пространство, прежде чем позиция табуляции заменяется символом табуляции. Эта замена не происходит в самом с открытым исходным кодом (BSD или Linux) реализации. Для межплатформенной непротиворечивости можно глобально заменить вкладку пространством путем передачи по каналу вывода к tr
с надлежащими параметрами. Например:
pr [arguments...] | tr '\t' ' ' |
PS
В то время как не часто используемый в сценариях оболочки, ps
команда ведет себя очень по-другому между операционными системами, следующими за BSD и семантикой AT&T. Различия получены в итоге в следующей таблице:
Флаг | AT&T | BSD |
---|---|---|
| Информация о дисплее о процессах других пользователей, включая тех, не управляя терминалами; то же как | Выведите на экран настройки переменной окружения для каждого процесса; то же как |
| Информация о дисплее о процессах с указанными лидерами сеанса. | Неиспользованная опция. |
| "Длинный” формат отображения; включает | "Длинный” формат отображения; не включает |
| Процессы дисплея, принадлежащие определенному пользователю. Например, | Выведите на экран поля |
Большая часть BSD и варианты Linux осудили использование вариантов BSD флагов, когда им предшествует тире. Передача этих флагов без тире в этих операционных системах будет генерировать поведение BSD более последовательно (по крайней мере, на BSD и основанных на Linux операционных системах). Однако, потому что это поведение не является переносимым, Вы не должны обычно зависеть от определенных причуд детали ps
реализация.
переименовать
rename
команда является командой, существующей на некоторых дистрибутивах Linux. Для добавления дальнейшего беспорядка существует две отдельных команды, имеющие это имя, в зависимости от распределения, и синтаксис для этих двух команд абсолютно отличается:
В некоторых дистрибутивах Linux,
rename
команда от util-linux-ng пакета, найденного в http://userweb .kernel.org / ~ kzak/util-linux-ng/.В других дистрибутивах Linux,
rename
сценарий Perl, также известный в различных воплощениях какprename
илиperl-rename
это поставляет как часть распределения Perl. Этот сценарий доступен от CPAN.
Поскольку использование rename
инструмент не является переносимым даже через дистрибутивы Linux, необходимо обычно использовать find
команда, если это возможно.
Если find
недостаточно, можно легко установить Perl rename
команда с помощью cpan
инструмент. Чтобы сделать это, сначала войдите в систему в как администраторский пользователь, затем выполните Терминал, затем введите:
sudo cpan File::Rename |
sudo
команда тогда просит, чтобы Вы ввели свой пароль администратора.
Один раз File::Rename
Пакет CPAN установлен, переименовать команда находится в /usr/local/bin
.
Обязательно задокументируйте эту нестандартную зависимость соответственно в Вашем сценарии, вместе с объяснением того, как установить модуль.
sed
Различные версии sed
используйте различные флаги для включения расширенных регулярных выражений. GNU sed
(обычно используемый в Linux), использует -r
флаг. Версии BSD sed
(включая версию OS X), используют -E
флаг. Если Ваш сценарий должен работать на обеих платформах, необходимо протестировать на совместимость сначала. Например:
STRING="$(echo 'xy' | sed -E 's/(x)y/\1/' 2> /dev/null)" |
if [ "$STRING" = "x" ] ; then |
SEDERE="-E" |
else |
SEDERE="-r" |
fi |
... |
sed $SEDERE ... |
Кроме того, большинство версий GNU sed
генерируйте предупреждения для неиспользованных меток. Большинство других реализаций не делает.
Кроме того, когда y
функция указана (например, sed y/string1/string2/
), большинство версий GNU преобразовывает двойные наклонные черты влево в единственные наклонные черты влево. Это поведение не является переносимым, таким образом, Вы не должны зависеть от него.
Из-за этой несовместимости, если необходимо создать выражение, содержащее вводимые пользователями строки, которые могли бы потенциально включать наклонную черту влево, необходимо избежать проблемы полностью при помощи s
функция (например, sed s/string1/string2/
) вместо y
функция.
вид
Форма sort +POS1 -POS2 ...
синтаксис, определенный для версии GNU sort
и считается устаревшим. Этот синтаксис не является переносимым и не поддерживается в OS X, начинающемся в версии 10.5.
Например:
$ cat data |
b a |
a b |
$ sort data |
a b |
b a |
$ sort +1 -2 data |
sort: invalid option -- 2 |
Try `sort --help' for more information. |
Вместо этого необходимо использовать -k
флаг, чтобы сделать ту же вещь. Например:
$ sort -k 2,3 data |
b a |
a b |
Для получения дополнительной информации о проблемах совместимости с sort
команда, см. страницу руководства для sort
.
stty
До OS X v10.5, stty
команда не поддерживала следующие режимы управления:
bs0
иbs1
cr0
,cr1
,cr2
, иcr3
ff0
иff1
nl0
иnl1
tab0
,tab1
,tab2
, иtab3
vt0
иvt1
Кроме того, до OS X v10.5, stty
не поддерживал следующие опции:
ocrnl
и-ocrnl
ofdel
и-ofdel
ofill
и-ofill
onlret
и-onlret
onocr
и-onocr
В устаревшем режиме все еще не приняты эти режимы и опции. Для получения дополнительной информации см. страницу руководства для stty
.
хвост
tail
команда отличается значительно между Linux и OS X. Вариант GNU tail
предоставляет возможности, которые версия OS X не делает и наоборот. Оба обеспечивают функции, которые не являются частью спецификации POSIX, и таким образом могут не быть переносимыми.
Согласно спецификации POSIX, следующие флаги являются переносимыми: -f
(продолжайте ожидать файла для роста или FIFO для предоставления дополнительных данных), -c
(количество байта), и -n
(количество строки).
Далее, POSIX только явно требует tail
команда для принятия единственного имени файла как параметр. Любое использование с многократными файлами является по сути не переносимым.
-b
(OS X)OS X обеспечивает a
-b
флаг, позволяющий Вам указывать расположение в 512-байтовых блочных инкрементах. Для максимальной мобильности умножьте число на 512 сами и используйте-c
флаг вместо этого.-F
(OS X и Linux)И Linux и OS X обеспечивают a
-F
флаг, который эквивалентен-f --retry
. Этого легко избегают с обходными решениями, описанными как часть записей для частного лица--follow
и--retry
флаги.--follow
(Linux)Linux также обеспечивает a
--follow
флаг, который эквивалентен-f
кроме тех случаев, когда используемый с дескрипторами файлов.При работе с файлами использовать
-f
вместо этого.Синтаксис дескриптора файла не является переносимым и не поддерживается кроме Linux. Используйте именованный канал (FIFO) вместо этого.
--max-unchanged-stat
(Linux)Linux обеспечивает a
--max-unchanged-stat
если Вы используете, это пытается вновь открыть файл-f
флаг и файл не изменились в некоторое время. Это позволяет ему обрабатывать случай здесь, файл переименован, и новый файл с тем же именем создается, как часто происходит с файлами журнала. Нет никакой простой переносимой замены для этой функции.--pid
(Linux)Linux обеспечивает a
--pid
флаг, завершающийсяtail
команда после указанного процесса ID умирает.Нет никакой простой переносимой замены для этой функции, хотя она могла быть заменена в не так переносимый вид сценарием, работающим как фоновое задание, использующее
ps
команда для проверки существования процесса.Принятие наблюдаемого процесса было первоначально запущено сценарием оболочки в фоновом режиме, это могло также быть заменено путем выполнения
tail
команда в фоновом режиме и использованиеwait
окружите встроенный для ожидания процесса ID для выхода, затем уничтоживtail
команда. Для получения дополнительной информации посмотрите Фоновые задания и Управление заданиями.-q
(Linux)Как с
head
команда, Linux обеспечивает-v
и-q
флаги. Посмотрите голову ранее в этом разделе для объяснения этих флагов и предложенных альтернатив.-r
(OS X)OS X обеспечивает a
-r
флаг, инвертирующий порядок распечатанных строк. Это также изменяет поведение продвижения плюс (+
) и минус (-
) символы, когда передано как часть параметров-b
,-c
, и-n
флаги.Возможно записать сценарий AWK для эмуляции этого поведения путем продвижения каждой строки во входном файле в массив, затем печати строк в обратном порядке и или пропуска данного числа записей в массиве для пропуска строк или использования
substr
вызовите для пропуска данного числа байтов. Главный раздел этой главы обеспечивает пример того, как эмулироватьhead -c
использование сценария AWK; этот пример обеспечивает хорошую начальную точку для записи сценария, эмулирующего этоtail
функция.--retry
(Linux)Linux обеспечивает a
--retry
отметьте, чтобы продолжить пытаться открыть файл, если он не делает существует.Это обычно используется, с
-f
флаг, и в том использовании, эквивалентен-F
флаг, который поддерживает OS X.Отдельно, однако, OS X не имеет никакого эквивалентного флага, хотя можно тривиально приблизить его более переносимым способом путем записи некоторое время цикла в сценарии оболочки, неоднократно проверяющем на файл, пока он не находит его, затем работает
tail
команда.-s
и--sleep-interval
(Linux)Linux обеспечивает
-s
и--sleep-interval
флаги для понижения использования CPU путем добавления задержки между проверками, чтобы видеть, смотрите ли файл Вы с-f
рос.-v
(Linux)Как с
head
команда, Linux обеспечивает-v
и-q
флаги. Посмотрите голову ранее в этом разделе для объяснения этих флагов и предложенных альтернатив.
В дополнение к этим различиям во флаге POSIX указывает что входные файлы для tail
должны быть допустимые текстовые файлы, что означает, что все последовательности байта должны быть допустимыми для текущей локали. Несмотря на то, что не все версии tail
осуществите это ограничение, делающие версии могут перестать работать, когда используется с двоичными файлами в некоторых операционных системах, если Вы не изменяете локальные настройки.
Если Ваши сценарии должны обработать двоичные файлы, несомненно, укажут локаль «C» перед выполняющимися командами, работающими с этими двоичными файлами. Для изменения локали выпустите следующее утверждение:
export LANG="C" |
Наконец, в отличие от этого head
команда, POSIX не требует что tail
команда быть в состоянии сохранить и распечатать текстовый блок произвольной длины. Это требует только, чтобы размер буфера был по крайней мере 10 раз значением LINE_MAX
. Значение LINE_MAX
является зависящим от реализации, но должны быть по крайней мере 2 048 байтов.
В то время как этот теоретический 20 480-байтовый предел в выводе tail
команда обычно не осуществляется в современных операционных системах, единственный гарантируемый переносимый способ генерировать большие результаты tail
должен использовать другой инструмент, такой как AWK.
программа uudecode, программа uuencode
В большей части Linux и полученных из BSD операционных систем, uudecode
применяет маску 0666
к режимам файла, таким образом предотвращая создание исполняемых файлов (или файлы с другими специальными режимами). В операционных системах, следующих за семантикой AT&T, не применяется никакая маска.
Для непротиворечивости, если Вы требуете результатов uudecode
чтобы быть исполнимой программой или иметь нестандартные режимы, Ваш сценарий должен установить выполнить флаг явно с chmod
.
В операционных системах, следующих за семантикой AT&T, если uudecode
перезаписывает существующий файл, он не может обязательно изменить свой режим, если файл не принадлежит текущему пользователю или uudecode
работает как пользователь root.
который
В OS X, which
команда может взять флаг-s для «тихого» поведения. В этом режиме это не выводит текста и возвращает статус выхода 0
если команда существует по какому-либо из путей, перечисленных в PATH
переменная окружения или 1
если это не делает (или 2
если Вы передаете недопустимый флаг).
Этот флаг не существует во многих операционных системах, повинующихся семантике AT&T. Версия GNU which
используемый в Linux также не поддерживает этот флаг. Как альтернатива, можно перенаправить вывод which
к /dev/null
как описано в Каналах и Перенаправлении.
Кроме того, некоторые (не все) дистрибутивы Linux идут с GNU which
команда. Эта команда отличается значительно по ее поведению от других подобных UNIX операционных систем. Для поддержки поиска многократных команд на сингле which
оператор, его статус выхода содержит число команд, не найденных, или-1, если Вы передаете его неизвестные флаги. (Это также поддерживает много флагов форматирования, которые не широко доступны.)
Для надежного межплатформенного использования необходимо указать точно один аргумент команды за один раз, не передать флаги (кроме повсеместного -a
флаг, при желании), и предполагают что статус выхода также -1
или 2
указывает ошибку использования.
кто
В операционных системах, следующих за семантикой AT&T, если Вы используете -u
флаг, who
команда выводит на экран процесс ID соответствия login
процесс. В операционных системах, следующих за семантикой BSD, она не выводит на экран процесс ID.
xargs
Если Вы передаете -L
отметьте к xargs
команда, xargs
вызывает указанную утилиту каждый раз, когда определенное число строк читается. Однако некоторые подробные данные отличаются немного:
Подсчет: В операционных системах, следующих за семантикой BSD, число строк основывается на числе новых строк, с которыми встречаются. Каждая строка (включая пустые строки) считается. В операционных системах, следующих за AT&T семантика UNIX, пустые строки проигнорированы для подсчета целей.
Связь: В операционных системах, следующих за AT&T семантика UNIX, любая строка, заканчивающаяся пространством, объединена со строками, следующими за ним, до и включая первую непустую строку. Эта связь не происходит в операционных системах, следующих за семантикой BSD.
Объединение Опций: В операционных системах, следующих за семантикой BSD,
-L
и-n
опции могут использоваться вместе. В операционных системах, следующих за AT&T семантика UNIX,-L
и-n
опции являются взаимоисключающими, и последний, данный на командной строке, будет использоваться.