Я не думаю, что проблема с каналом. Это кажется, что Ваш длительный процесс не сбрасывает свой собственный буфер достаточно часто. Изменение размера буфера канала было бы взломом для обхода его, но я не думаю его возможное, не восстанавливая ядро - что-то, что Вы не хотели бы делать как взлом, поскольку это, вероятно, неохотно влияет на большое количество других процессов.
autoconf руководство имеет раздел по портативному программированию оболочки.
Хотя это конкретно не предназначается для POSIX, это - вероятно, самый полный набор того, что сделать а не сделать при попытке написать портативный код оболочки.
В дополнение к dash
и posh
, существует bournesh
(или bsh
), Оболочка Bourne Семейной реликвии, которая может использоваться для обнаружения Bashisms.
Проект Семейной реликвии также включает "Семейную реликвию Toolchest", набор больше чем 100 стандартных утилит Unix (который мог служить начальной точкой для сравнения параметров командной строки).
Подобный этому ответу, попытайтесь выполнить свой сценарий в шикарном.
Кроме того, не забывайте устанавливать POSIXLY_CORRECT
переменная среды к истинному, поскольку это заставляет много программ (не только оболочка) придерживаться более строго стандартов POSIX.
Запись Ваших сценариев с помощью тире могла бы быть запуском.
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
флаг может быть полезен для в Вашем случае.
Сегодня вы обычно можете найти в системе оболочку 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 года. Это необходимо только в том случае, если вы должны писать для системы, в которой на самом деле нет любая другая оболочка.