Разработка сценариев для межплатформенного развертывания

По большей части, сценарии, работающие на других основанных на UNIX или подобных UNIX платформах (Linux, например) также выполненный правильно на OS X и наоборот. Существуют различия, как бы то ни было.

В дополнение к нахождению тонких изменений в иерархии файловой системы и поведении общих инструментов командной строки, Вы также сочтете различные инструменты и технологии для устройства I/O и для добавления и удаления пользователей и групп.

Версия оболочки Bourne

OS X обеспечивает BASH как свою реализацию Оболочки Bourne. Когда выполняется как /bin/sh, это должно быть полностью совместимо с другими реализациями. Однако иногда различия могут возникнуть. То же верно для других операционных систем, использующих BASH или ZSH как их реализация Оболочки Bourne.

Для максимальной совместимости необходимо тщательно избегать использования любых СПЕЦИФИЧНЫХ ДЛЯ BASH расширений в сценариях оболочки. Если Вы не можете избежать расширений BASH, необходимо явно заставить сценарий выполниться в BASH путем изменения первой строки на следующее:

#!/bin/bash

Необходимо использовать подобную первую строку для сценариев записанное использование расширения ZSH.

Межплатформенные окончания строки

Различные операционные системы используют различные символы для указания конца каждой строки в текстовых файлах. Это может вызвать странное и необычное поведение, если Вы не ожидаете его:

Это обычно прямо, чтобы обнаружить строку конечный тип текстового файла и считать его правильно. Следующий фрагмент кода демонстрирует один путь:

  Окончания строки Преобразования перечисления 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 между форматами окончания строки

# Convert from legacy Mac-style CR line endings
# to UNIX-style LF line endings for use with
# command-line tools
tr '\r' '\n' < mac_text_file > unix_text_file
 
# Convert from UNIX-style LF to legacy Mac-style CR
# line endings
tr '\n' '\r' < unix_text_file > mac_text_file
 
# Convert from Windows-style CR/LF line endings (or
# LF/CR line endings) to UNIX line endings
tr -d '\r' < windows_text_file > unix_text_file
 
# Convert from UNIX-style LF line endings to
# Windows-style CR/LF line endings
CR="$(printf "\r")"
sed "s/$/$CR/" < unix_text_file > windows_text_file

Работа с устройством I/O

OS X использует Набор I/O для драйверов устройств. В отличие от большинства основанных на UNIX и подобных UNIX операционных систем, большинство устройств не представлено через файлы устройств в /dev. (Диски и последовательные порты являются существенными исключениями.)

В целом устройство I/O должно быть записано на языке C-derived с помощью функциональности в платформе Набора I/O. Однако, если Вы пишете свой собственный драйвер устройства, можно представить файл устройств в /dev при желании.

См. Основные принципы IOKit для получения общей информации, Получая доступ к Аппаратным средствам Из Приложений, чтобы изучить, как записать приложение в драйверы устройства доступа от пространства пользователя или Руководство по программированию Ядра, чтобы изучить, как поддерживать файлы устройств и ioctl системный вызов в ядре.

Иерархия файловой системы

Много файлов находятся в различных местах в OS X, чем в других операционных системах. Для получения дополнительной информации о расположении OS X, считайте Обзор Файловой системы. Для получения дополнительной информации о других операционных системах, считайте следующее:

Задачи системного администрирования

Этот раздел обеспечивает обзор нескольких задач администрирования общей системы. Полный обзор задач системного администрирования выходит за рамки этого документа. Для более полной обработки считайте Введение в администрацию Командной строки в 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 операционные системы обычно попадают в один из трех лагерей:

За эти годы много стандартов появились для смягчения различий в синтаксисе между этими операционными системами, включая 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

-f без -p

Целевые неизменные полномочия файла.

Целевой набор полномочий файла к полномочиям по умолчанию.

-f с -p

Целевой набор полномочий файла к полномочиям исходного файла.

Целевой набор полномочий файла к полномочиям исходного файла.

Наконец, в операционных системах, следующих за семантикой 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» перед выполняющимися командами, работающими с этими двоичными файлами. Для изменения локали выпустите следующее утверждение:

export LANG="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

-e

Информация о дисплее о процессах других пользователей, включая тех, не управляя терминалами; то же как -A.

Выведите на экран настройки переменной окружения для каждого процесса; то же как -E.

-g

Информация о дисплее о процессах с указанными лидерами сеанса.

Неиспользованная опция.

-l

"Длинный” формат отображения; включает paddr поле.

"Длинный” формат отображения; не включает paddr поле.

-u

Процессы дисплея, принадлежащие определенному пользователю. Например, ps -u root дисплеи все процессы, принадлежащие пользователю root.

Выведите на экран поля user, pid, %cpu, %mem, vsz, rss, tt, state, start, time и command. Также подразумевает -r опция (вид использованием CPU).

Большая часть 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 опции являются взаимоисключающими, и последний, данный на командной строке, будет использоваться.