2014-09-17 3 views
3

У меня есть сценарий оболочки, который я хотел бы запускать на нескольких платформах, поддерживающих bash. Моя проблема в том, что некоторые команды ведут себя по-разному в Linux, FreeBSD, OS X и Cygwin.Каков наилучший способ написания кросс-платформенных сценариев оболочки

Моя мысль до сих пор являются:

  • Создание реализации по умолчанию для всех операций OS конкретных в главном скрипте, а затем проверьте $OSTYPE и source файл реализации конкретных, которые (возможно) заменяет команды, ведут себя по-другому. И если я это сделаю, как мне обрабатывать команды с несколькими аргументами? Четыре позиционных аргумента, переданных функции, не являются самым чистым подходом.
  • Поместите все реализации в мой скрипт, каждый с аффиксом в имени, проверьте $OSTYPE и создайте переменную OPSUFFIX, а затем вызовите operation$OPSUFFIX для каждой операции.
  • ./configure магия?
  • Перенос на что-то вроде Python — может быть самым разумным, но требует большинства изменений кода. И если это идиоматический сценарий инициализации, это не вариант.
+0

Если вы хотите что-то действительно перекрестная платформа, вам нужно перейти от сценариев к программированию - есть много языков, которые абстрагируют реализацию ОС от кода; Python, Ruby, Java, чтобы назвать несколько. Если вы заставляете пользователей Windows устанавливать Cygwin (eew), то для их установки один из других не нужен. –

+0

Многие стандартные команды имеют стандартизованное поведение для большей части того, что они делают. Если вам удастся остаться в этой зоне (и вы можете утверждать 'bash', что не обязательно то, что вы можете обоснованно утверждать), вы обычно можете написать в основном переносимый скрипт. –

+1

@BoristheSpider Нет ничего плохого в использовании Cygwin или UWin как части собственного рабочего процесса, особенно для использования ваших кросс-платформенных скриптов. Я понятия не имею, как обойтись без Cygwin. – ormaaj

ответ

1

Прежде всего, где это возможно, найдите способы сделать то, что вы хотите, где различия не будут иметь значения. В качестве примера некоторые версии tar не поддерживали опцию -z для обработки gzipped-файлов. Однако сочетание tar и gzip было переносимым. Аналогичным образом существуют способы вызова ps, которые обычно работают как на BSD, так и на LINUX.

Как только вы обнаружите, что у вас все еще есть вещи, с которыми вам нужно иметь дело, ваш подход к поиску файла для обеспечения функций, которые обрабатывают синтаксис команды, кажется разумным. Чтобы избежать позиционных аргументов, вы можете использовать getopt, который является встроенным bash.

Альтернативой может быть написать скрипт python или аналогичный, который просто инкапсулирует худшее из поведения команды, зависящей от platfrom.

Смежные вопросы