Puncte:0

Cum se convertesc scriptul BASH în DASH sau alte soluții?

drapel ng

Creez un pachet de distribuitor AWS pentru a modifica configurația syslog pe diferite variante de servere Linux. Am scris câteva scripturi bash simple pentru a gestiona instalarea, dezinstalarea și actualizarea. Am crezut că asta va fi universal. Cu toate acestea, astăzi am aflat că AWS folosește SH pentru a executa scriptul (de ex. sh install.sh) și pe Ubuntu/Debian, acesta este implicit DASH și nu BASH. Din acest motiv, scripturile mele eșuează cu:

erori de actualizare: update.sh: 3: update.sh: funcție: nu a fost găsită

update.sh: 9: update.sh: Eroare de sintaxă: „}” neașteptată

nu a reușit să ruleze comenzi: starea de ieșire 2

Pachetul nu s-a instalat; stare de instalare Eșuat

Nu pot schimba comportamentul AWS. Și nu vreau să modific nicio configurație pe server. Deci, s-ar părea că singurele mele opțiuni sunt cele care modifică fișierul script în sine?

Prima preferință ar fi să faceți scriptul universal, astfel încât să poată rula pe orice versiune de Linux. A doua preferință ar fi să creați un script diferit pentru Debian, care să fie compatibil cu DASH.

Din păcate, nu găsesc multe informații despre programarea liniuțelor. Orice sugestii?

Cele 3 scenarii în cauză sunt....

install.sh

#!/bin/bash

funcția este instalată {
  dacă sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; atunci
    Adevărat
  altfel
    fals
  fi
}

dacă este Instalat; atunci
  iesirea 0
altfel
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
fi

uninstall.sh

#!/bin/bash

funcția este instalată {
  dacă sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; atunci
    Adevărat
  altfel
    fals
  fi
}

dacă este Instalat; atunci
  sudo rm /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
altfel
  iesirea 0
fi

update.sh

#!/bin/bash

function isDiff {
  dacă sudo diff xdr.conf /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; atunci
    fals
  altfel
    Adevărat
  fi
}

if isDiff; atunci
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  sudo service rsyslog restart
altfel
  iesirea 0
fi
drapel ph
Dacă schimbați shebang-ul în `#!/bin/sh`, [shellcheck.net](https://www.shellcheck.net) va sublinia că utilizați o sintaxă nestandard pentru a vă defini funcțiile. De asemenea, consultați [„Dash as /bin/sh”](https://wiki.ubuntu.com/DashAsBinSh) în wiki-ul Ununtu și instrumentul `checkbashisms` pe care îl descrie.
Puncte:1
drapel us

Există două sintaxe de funcții diferite în bash/ksh/zsh. Folosești stilul ksh: numele funcției { ⦠}. Cealaltă formă este justă nume() { ⦠} și este forma introdusă târziu în coaja originală Bourne.

Chiar nu are rost să faci:

    dacă cmd; atunci
      Adevărat
    altfel
      fals
    fi

În afară de a transforma toate stările de returnare diferite de zero la 1, aceasta este la fel ca doar rularea cmd. Și cu funcția redusă la o singură linie, chiar nu aveți nevoie de o funcție. De asemenea, aș fi tentat să folosesc cmp -s în loc de dif sau pur și simplu să faci copia necondiționat. Și nu folosi ls pentru a testa existența unui fișier. Fie Test comanda sau [ este destinat acestui scop: [ -e /etc/rsyslog.d/xdr.conf ]. Asta există într-o formă externă, dacă ai sudo.

Appleoddity avatar
drapel ng
Bună. Voi lua în considerare sugestiile dumneavoastră pentru compararea/testarea fișierelor. Dar, scopul testului este pentru că nu vreau ca daemonul syslog să fie repornit întotdeauna. Acest script este ceva care va rula zilnic, ca parte a asigurării că instanța este configurată și/sau actualizată dacă configurația se modifică. Ar trebui să iasă cu un cod 0, astfel încât AWS să creadă că este OK. Sau un cod diferit de zero pentru a indica o problemă.
drapel ph
@Appleoddity Ideea este că, de ex. funcția `isInstalled` ar putea fi definită ca `isInstalled() { [ -e /etc/rsyslog.d/xdr.conf ]; }` -- va returna starea testului direct, fără a fi nevoie de „dacă”, „adevărat”, „fals” etc. Sau, puteți sări peste funcția în întregime și, în partea principală a scriptului, utilizați `if [ -e /etc/rsyslog.d/xdr.conf ]; apoi...`.
Appleoddity avatar
drapel ng
@GordonDavisson ok. Mulțumesc. Va trebui să fac câteva cercetări pentru a înțelege mai bine această sintaxă. Sugerați că această sintaxă ar fi compatibilă cu bash și dash?
drapel ph
@Appleoddity Da, acea sintaxă ar trebui să funcționeze în orice shell compatibil cu POSIX (bash, dash, ksh, etc) și cred că chiar și shell-uri în stil Bourne pre-POSIX (dar nu cu shell-uri non-Bourne, cum ar fi csh sau fish) .

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.