Различия между sed на MAC OSX и другим “стандартом” sed?

Видел systemd упомянутый на Дуге Общий ML сегодня. Таким образом читайте на нем. H Онлайн как всегда является большим источником для Технологии Linux и - где я нашел, что мое место начало исследовать Systemd как Новомодную альтернативу и SysV Init. Однако статья H Online (в этом случае) не является очень полезным чтением, реальное использование позади нее - она, дает ссылки на полезные чтения.

Реальный ответ находится в объявлении о systemd. Который дает несколько критических моментов что случилось с SysV initd, и что должны сделать новые системы

  • Запускаться меньше.
  • И запускаться больше параллельно.

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

Другая часть плана, кажется, чтобы не сериализировать файловые системы, но вместо этого смонтировать их по требованию также, тот способ, которым Вы не ожидаете на Вашем /home/, и т.д. (чтобы не быть перепутанным с /etc) смонтироваться, и/или fsck когда Вы могли запускать демонов как / и /var/ и т.д., уже смонтированы. Это сказало, что собиралось использовать autofs с этой целью.

Это также имеет цель создания .desktop разработайте init дескрипторы как замену для сценариев. Это предотвратит тонны медленных sh процессы и еще больше ветвлений процессов от вещей как sed и grep это часто используется в сценариях оболочки.

Они также планируют не запустить некоторые сервисы, пока относительно них не просят и возможно даже отключают их, если они больше не необходимы, модуль Bluetooth, и демон только необходим, когда Вы используете bluetooth-устройство, например. Другим данным примером является ssh демон. Это - вид вещи, к которой inetd способен. Лично я не уверен, что мне нравится это, поскольку это могло бы означать задержку, когда мне действительно нужны они, и в случае ssh я думаю, что это означает возможную уязвимость системы обеспечения безопасности, если бы мои inetd были поставлены под угрозу, то целая система была бы. Однако мне сообщили, что с помощью этого для нарушения этой системы неосуществимо и что, если я хочу, я могу отключить эту опцию на сервис и другими способами.

Другая функция, по-видимому, будет возможностью запуститься на основе событий времени, или в регулярно запланированном интервале или в определенное время. Это подобно какой crond и atd сделайте теперь. Хотя мне сказали, что это не будет поддерживать пользователя "крон". Лично это походит на самую бессмысленную вещь. Я думаю, что это писалось/думалось людьми, которые не работают в пользовательских средах, нет большой цели к пользовательскому крону, если Вы - единственный пользователь в системе кроме не выполнения как корень. Я ежедневно работаю над многопользовательскими системами, и правило всегда является запускаемыми пользовательскими скриптами как пользователем. Но возможно у меня нет предвидения, которое они делают, и оно никоим образом не сделает его так, чтобы я не мог работать crond или atd, таким образом, никому, но разработчикам не причиняет боль, что я предполагаю.

Большой недостаток systemd - то, что некоторые демоны должны будут быть изменены, чтобы в полной мере воспользоваться им. Они будут работать теперь, но они работали бы лучше, если бы они были записаны специально для его модели сокета.

Кажется по большей части, что проблемой народов systemd с выскочкой является система событий, и что они полагают, что это не имеет смысл или является ненужным. Возможно, их слова помещают его лучше всего.

Или помещать его более простой: то, что пользователь только что запустил D-шину, никоим образом не является признаком, что NetworkManager должен быть запущен также (но это - то, что Выскочка сделала бы). Это правильно наоборот: когда пользователь просит NetworkManager, который является определенно признаком, что D-шина должна быть запущена также (который является, конечно, что большинство пользователей ожидало бы, правильно?).
Хорошая init система должна запустить только, что необходимо, и что по запросу. Или лениво или параллелизированный и заранее. Однако это не должно запускаться более, чем необходимый, особенно не все установило, который мог использовать тот сервис.

Поскольку я уже сказал, что это обсуждено намного более всесторонне в объявлении о systemd.

62
13.04.2017, 15:36
4 ответа

Поведение утилит оболочки действительно отличается незначительными способами между вариантами Unix. Существует много вариантов Unix с комплекс история. Существуют работы по стандартизации, такие как стандарт POSIX и его надмножество Единственная спецификация UNIX. Большинство систем в наше время реализует POSIX:2001, также известный как Единственная версия 3 Спецификации UNIX, с незначительными отклонениями и многими расширениями. Единственная спецификация Unix не является учебным руководством, но версия 3 читаема, если у Вас уже есть идея того, что делает команда. Можно консультироваться с ним, чтобы знать, является ли некоторая функция стандартной или расширение конкретной системы.

Большинство пользователей UNIX использует Linux и не использовало никакой другой вариант. Linux идет с утилитами GNU, которые часто имеют много расширений стандарта. Таким образом, Вы найдете довольно много кода там, который работает над Linux, но не над другими нельдами, потому что он полагается на те расширения.

Относительно sed консультируйтесь с sed Единственной спецификацией Unix для минимума, который каждая система, как предполагается, поддерживает, страница справочника в Вашей системе для того, что Ваша поддержка внедрения и GNU sed руководство для того, что там использует большинство людей.

Одно из нестандартных расширений в GNU sed поддерживает несколько команд, выполненных вместе. Например, этот GNU sed программа печатает все строки, содержащие a, но изменения b в c во-первых:

sed -ne '/a/ {s/b/c/g; p}'

{ и } на самом деле отдельные команды, таким образом, для полной мобильности, необходимо указать их любой на отдельных строках (в файле) или в отдельном -e аргументы (на командной строке). Отсутствие разделителя команды после { и использование ; как разделитель команды общие расширения. Отсутствие разделителя команды прежде } менее общее расширение. Это стандартно-совместимо:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Это нестандартно, но обычно принято:

sed -ne '/a/ { s/b/c/g; p; }'

Другое нестандартное, но общее расширение является использованием \n означать новую строку в a s текст замены (использование в regexp является стандартным). Портативный метод должен включать новую строку обратной косой черты в sed сценарий. Другое общее расширение \+, \? и \| в regexps для значения одного или нескольких, самое большее один и чередование; портативные основные регулярные выражения не имеют ни одного из них. Например, первая команда является непортативным способом заменить непрерывные последовательности пробела новой строкой; вторая команда является совместимым стандартами эквивалентом.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'
45
27.01.2020, 19:32
  • 1
    Обратите внимание, что во всех тех случаях о расширениях GNU, это - использование, которое нестандартно. GNU sed самостоятельно совместимо, поскольку это делает позволенные вещи (но не - требуемый, неуказанный) стандартом. Существуют случаи, где это не совместимо и где выполнение его с POSIXLY_CORRECT в среде может помочь. Как с s/[\n]//g это должно удалить обратную реакцию и n символы, но удаляют новые строки вместо этого. Или поведение N команда на последней строке. –  Stéphane Chazelas 23.07.2017, 11:01
  • 2
    sed -ne '/a/ { s/b/c/g; p; }' является стандартным начиная с выпуска 2016 года стандарта. Это было всегда портативно. Посмотрите Согласованный austingroupbugs.net/view.php?id=944&nbn=7 –  Stéphane Chazelas 23.07.2017, 11:04
[1179839]OS X в настоящее время поставляется с FreeBSD sed с 2005 года. Большинство различий ниже также относится и к другим версиям BSD sed.[12173]-Op X's sed использует [1180352]-E[1180353] для ERE, а GNU sed использует [1180354]-r[1180355]. [1180356]-E[1180357] является псевдонимом для [1180358]-r[1180359] в GNU sed (добавлено в 4.2, не документировано до 4.3). Более новые версии FreeBSD и NetBSD sed поддерживают как [1180360]-E[1180361], так и [1180362]-r[1180363]. OpenBSD sed поддерживает только [1180364]-E[1180365].[12174]-i ''[1180367] работает с sed операционной системы X, но не с GNU sed. [1180368]-i[1180369] работает с GNU sed, последние версии NetBSD, OpenBSD [1180370]sed[1180371], но не с OS X's sed. [1180372]-i -e[1180373] работает с обеими версиями, но в случае FreeBSD [1180374]sed[1180375] делает резервную копию оригинального файла с приложением [1180376]-e[1180377] к имени файла (и вам нужно передать не более одного выражения в [1180378]sed[1180379]). [12175] GNU sed интерпретирует экранированные последовательности как [1180380] \t[1180381], [1180382] \n[1180383], [1180384] \001[1180385], [1180386] \x01[1180387], [1180388] \w[1180389] и [1180390] \b[1180391]. OS X sed и POSIX sed интерпретируют только [1180392] \n[1180393] (но не в заменяющей части [1180394]s[1180395]).[12176] GNU sed интерпретирует [1180396] \|[1180397], [1180398] \+[1180399] и [1180400] \?[1180401] в BRE, но OS X's sed и POSIX sed не интерпретируют. [1180402]\([1180403], [1180404]\)[1180405], [1180406]\{[1180407] и [1180408]\}[1180409] являются POSIX BRE.[12177]GNU sed позволяет опустить [1180410];[1180411] или новую строку перед [1180412]}[1180413], но OS X's sed не делает этого. За [12178]i[1180415] (вставить), [1180416]a[1180417] (добавить) и [1180418]c[1180419] (изменить) должны последовать обратный слеш и новая строка в OS X's sed и POSIX's sed, но не в GNU's sed. GNU sed добавляет недостающую новую строку после текста, вставленного [1180420]i[1180421], [1180422]a[1180423], или [1180424]c[1180425], но в OS X's sed - нет. Например, [1180426]sed 1ia[1180427] - это GNU-альтернатива [1180428]sed $'1i\\\na\n'[1180429].[12179] Например, [1180430]printf a|sed -n p[1180431] добавляет новую строку в OS X's sed, но не в GNU's sed. [12180]OS X's sed не поддерживает модификаторы [1180432]I[1180433] (не чувствительные к регистру) или [1180434]M[1180435] (многострочные). Более новые версии FreeBSD sed поддерживают [1180436]I[1180437]. [12181]OS X's sed не поддерживает [1180438]-s[1180439] ([1180440]-separate[1180441]), [1180442]-u[1180443] ([1180444]--unbuffered[1180445]), или [1180446]-z[1180447] ([1180448]--null-data[1180449]). [12182]Одним из вариантов BSD, который не поддерживается GNU sed, является [1180450]-a[1180451], что заставляет [1180452]w[1180453] добавлять к файлу вместо того, чтобы усекать файл. [12183] Примеры команд GNU sed, которые не работают с sed операционной системы X:[12184]
65
27.01.2020, 19:32

Лучший способ заставить один и тот же скрипт работать как на Linux, так и на Mac — это:

sed -i.bak -e 's/foo/bar/' -- "${TARGET}" &&
  rm -- "${TARGET}.bak"
9
27.01.2020, 19:32

Эта команда

sed 's/123\(4\+\)5/\1/g'

, который работает в Linux, необходимо изменить на

sed -E 's/123(4+)5/\1/g'

для работы на моем Mac.

Таким образом, на Mac нельзя избегать скобок, звездочек и плюсов. Также вам нужно добавить флаг -E.

4
19.01.2021, 15:31

Теги

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