Рейтинг:0

Как преобразовать скрипт BASH в DASH или другие решения?

флаг ng

Я создаю пакет дистрибьютора AWS для изменения конфигурации системного журнала на разных вариантах серверов Linux. Я написал несколько простых сценариев bash для установки, удаления и обновления. Я думал, что это будет универсально. Однако сегодня я узнал, что AWS использует ш для выполнения скрипта (т.е. ш установить.ш), а в Ubuntu/Debian по умолчанию используется DASH, а не BASH. По этой причине мои сценарии терпят неудачу:

ошибки обновления: update.sh: 3: update.sh: функция: не найдена

update.sh: 9: update.sh: синтаксическая ошибка: "}" неожиданно

не удалось запустить команды: статус выхода 2

Не удалось установить пакет; статус установки не удалось

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

Первое предпочтение было бы сделать сценарий универсальным, чтобы он мог работать в любой версии Linux. Второй вариант — создать другой сценарий для Debian, совместимый с DASH.

К сожалению, я не нашел много информации о программировании тире. Какие-либо предложения?

Рассматриваемые 3 скрипта....

install.sh

#!/бин/баш

функция установлена ​​{
  если sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; тогда
    истинный
  еще
    ЛОЖЬ
  фи
}

если установлен; тогда
  выход 0
еще
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  перезапустить службу sudo rsyslog
фи

удалить.sh

#!/бин/баш

функция установлена ​​{
  если sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; тогда
    истинный
  еще
    ЛОЖЬ
  фи
}

если установлен; тогда
  sudo rm /etc/rsyslog.d/xdr.conf
  перезапустить службу sudo rsyslog
еще
  выход 0
фи

update.sh

#!/бин/баш

функция isDiff {
  если sudo diff xdr.conf /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; тогда
    ЛОЖЬ
  еще
    истинный
  фи
}

если естьРазница; тогда
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  перезапустить службу sudo rsyslog
еще
  выход 0
фи
флаг ph
Если вы измените шебанг на `#!/bin/sh`, [shellcheck.net](https://www.shellcheck.net) укажет, что вы используете нестандартный синтаксис для определения своих функций. Также см. ["Dash as /bin/sh"](https://wiki.ubuntu.com/DashAsBinSh) в вики Ununtu и инструмент `checkbashisms`, который он описывает.
Рейтинг:1
флаг us

В bash/ksh/zsh есть два разных синтаксиса функций. Вы используете стиль ksh: имя функции { ¦ }. Другая форма просто имя () { ¦ } и это форма, представленная позже в оригинальной оболочке Bourne.

Это действительно бессмысленно:

    если команда; тогда
      истинный
    еще
      ЛОЖЬ
    фи

Помимо превращения всех ненулевых статусов возврата в 1, это то же самое, что просто запустить команда. А с функцией, сокращенной до одной строки, вам действительно не нужна функция. Я бы также хотел использовать cmp -s вместо разница или просто сделать копию безоговорочно. И не используйте лс для проверки существования файла. Либо тестовое задание команда или [ предназначен для этой цели: [-e /etc/rsyslog.d/xdr.conf]. Это существует во внешней форме, если у вас есть судо.

Appleoddity avatar
флаг ng
Привет. Я учту ваши предложения для сравнения/тестирования файлов. Но цель теста в том, что я не хочу, чтобы демон системного журнала всегда перезапускался. Этот сценарий будет выполняться ежедневно, чтобы убедиться, что экземпляр настроен и/или обновлен в случае изменения конфигурации. Он должен выйти с кодом 0, чтобы AWS считал, что все в порядке. Или ненулевой код, указывающий на проблему.
флаг ph
@Appleoddity Дело в том, что, например. функция `isInstalled` может быть просто определена как `isInstalled() { [ -e /etc/rsyslog.d/xdr.conf]; }` -- он вернет статус теста напрямую, без необходимости использования `if`, `true`, `false` и т. д. Или вы можете полностью пропустить эту функцию и в основной части скрипта использовать `if [ -e /etc/rsyslog.d/xdr.conf ]; тогда ...`.
Appleoddity avatar
флаг ng
@GordonDavisson хорошо. Спасибо. Мне придется провести некоторое исследование, чтобы лучше понять этот синтаксис. Вы предполагаете, что этот синтаксис будет совместим с bash и dash?
флаг ph
@Appleoddity Да, этот синтаксис должен работать в любой POSIX-совместимой оболочке (bash, dash, ksh и т. д.), и я думаю, что даже в оболочках в стиле Bourne до POSIX (но не в оболочках, отличных от Bourne, таких как csh или fish) .

Ответить или комментировать

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