Ресурсы для портативного программирования оболочки

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

68
18.11.2011, 01:47
6 ответов

autoconf руководство имеет раздел по портативному программированию оболочки.

Хотя это конкретно не предназначается для POSIX, это - вероятно, самый полный набор того, что сделать а не сделать при попытке написать портативный код оболочки.

32
27.01.2020, 19:31
  • 1
    Это - один из лучших ресурсов и было создано, в то время как написание кода в M4, который должен был произвести код оболочки, который был портативным через как можно больше оболочек. –  Tim Post♦ 01.06.2011, 02:28

В дополнение к dash и posh, существует bournesh (или bsh), Оболочка Bourne Семейной реликвии, которая может использоваться для обнаружения Bashisms.

Проект Семейной реликвии также включает "Семейную реликвию Toolchest", набор больше чем 100 стандартных утилит Unix (который мог служить начальной точкой для сравнения параметров командной строки).

6
27.01.2020, 19:31
  • 1
    , что Оболочка Bourne не является оболочкой POSIX, делание Вашего сценария, портативного к Оболочке Bourne, означало бы понижать синтаксис Вашего сценария от стандартного POSIX sh язык к общему знаменателю между этим и синтаксисом Оболочки Bourne. Не стоящий мнения, если Вы не хотите быть портативными к древним системам (или Солярис 10 и ранее и у Вас нет выбора использовать стандарт sh, который был в/usr/xpg4/bin там). потрясающий –  Stéphane Chazelas 04.11.2015, 18:57

Подобный этому ответу, попытайтесь выполнить свой сценарий в шикарном.

Кроме того, не забывайте устанавливать POSIXLY_CORRECT переменная среды к истинному, поскольку это заставляет много программ (не только оболочка) придерживаться более строго стандартов POSIX.

5
27.01.2020, 19:31

Запись Ваших сценариев с помощью тире могла бы быть запуском.

4
27.01.2020, 19:31
  • 1
    Тестирование с тире является абсолютным минимумом для предотвращения случайной уверенности в ksh/bash функциях, но я после больше, чем это: знание о дефицитах в других оболочках (например, плохая обработка прерывания zsh), и прежде всего в утилитах оболочки (например, OpenBSD find все еще не реализовал -exec +). –  Gilles 'SO- stop being evil' 24.03.2011, 10:18

Чтобы немного расшириться можно попробовать checkbashisms в Debian/Ubuntu's devscripts пакет.

Это не прекрасно, но это обладает преимуществом того, чтобы быть существующей начальной точкой. Например, это не видит классических незначительных сбоев с sed/find относительно GNU по сравнению с различиями BSD/other.

По умолчанию это - ориентированный Debian+dash, -p флаг может быть полезен для в Вашем случае.

2
27.01.2020, 19:31

Сегодня вы обычно можете найти в системе оболочку POSIX, и это обычно означает, что вы можете создавать сценарии на языке POSIX (по модулю, обнаруживающему ошибки соответствия).

Единственная проблема заключается в том, что / bin / sh иногда не является оболочкой POSIX. И вы должны жестко запрограммировать #! строка в скриптах, которые должны вести себя как хорошие исполняемые файлы; вы не можете просто попросить пользователя исследовать проблему, а затем вызвать ваш скрипт как / path / to / posix / shell myscript .

Итак, уловка состоит в том, чтобы использовать в вашем скрипте возможности POSIX, но заставить скрипт автоматически находить оболочку POSIX. Один из способов сделать это так:

#!/bin/sh

# At this point, we may be running under some old shell
# we have to tread carefully.

# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".

if ! test x$posix_shell = x ; then
  # the three possible shell paths are just an example;
  # please extend as necessary.

  for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
    if test -x $shell ; then
       posix_shell=$shell
    fi
  done
  if test x$posix_shell = x ; then
    echo "no POSIX shell found"
    exit 1
    # or we could avoid bailing here and just fall back on /bin/sh:
    # echo "falling back on /bin/sh: cross your fingers that it works"
    # posix_shell=/bin/sh
  fi
  export posix_shell

  # plain "$@" is broken in ancient shells! 
  # I seem to recall ${@+"$@"}: not sure if that's the right trick.

  exec $posix_shell $0 ${@+"$@"}  # can we count on exec in legacy shells? 
fi

# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.

Есть и другие подходы, такие как генерация кода. Усовершенствуйте свои скрипты с помощью небольшого скрипта, который принимает тело файлов скриптов без символа #! линия и добавляет единицу.

Худшее, что вы можете сделать, - это начать писать целые сценарии таким образом, чтобы они работали в оболочке Bourne с 1981 года. Это необходимо только в том случае, если вы должны писать для системы, в которой на самом деле нет любая другая оболочка.

2
27.01.2020, 19:31

Теги

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