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

update errors: update.sh: 3: update.sh: function: not found

update.sh: 9: update.sh: Syntax error: "}" unexpected

failed to run commands: exit status 2

Failed to install package; install status Failed

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

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

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

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

install.sh

#!/bin/bash

function isInstalled {
  if sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; then
    true
  else
    false
  fi
}

if isInstalled; then
  exit 0
else
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
fi

удалить.sh

#!/bin/bash

function isInstalled {
  if sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; then
    true
  else
    false
  fi
}

if isInstalled; then
  sudo rm /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
else
  exit 0
fi

update.sh

#!/bin/bash

function isDiff {
  if sudo diff xdr.conf /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; then
    false
  else
    true
  fi
}

if isDiff; then
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
else
  exit 0
fi
answer

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

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

    if cmd; then
      true
    else
      false
    fi

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