it-swarm-eu.dev

Jak mohu otestovat shodu skriptů Shell s POSIX?

Vzhledem k tomu, že POSIX je ve všech odvětvích nejblíže běžné normě, zajímalo by mě, jestli existuje prostředí, které je podporuje výhradně. Zatímco většina moderních skořápek poskytuje podporu POSIXu (a bez problémů bude spouštět skripty kompatibilní s POSIXem), nedělají dobrou práci při poukazování na nekompatibilní funkce.

Existuje nějaké prostředí, které implementuje pouze POSIX a POSIX, a to takovým způsobem, že vyvolá chybu u jakékoli nevyhovující funkce?

EDITOVAT Chci objasnit, že nepožaduji obecné tipy pro psaní přenosných skriptů Shell. Související otázka uvedená v komentářích ji již zahrnovala. Na tuto otázku jsem myslel, když jsem zjistil, že bash--posix možnost, ale pouze zjistit, že to ovlivňuje pouze některé intializační chování, které není přesně to, co hledám.

78
rahmu

Bohužel, 'portable' je obvykle silnější požadavek než 'POSIX-kompatibilní' pro skripty Shell. To znamená, že psaní něčeho, co běží na jakémkoli POSIX Shell, není příliš těžké, ale dostat ho na jakýkoli Shell v reálném světě je těžší.

Začněte tím, že do svého správce balíků nainstalujete každé Shell, zejména zvuky posh debianů, jako to, co chcete (Ordinary Shell vyhovující zásadám). Zásadou Debianu je POSIX s několika výjimkami (echo -n uvedeno, local ...).

Kromě toho však musí testování zahrnovat několik nábojů (zejména/bin/sh) na řadě platforem. Testuji na systémech Solaris (/ bin/sh a xpg4/sh) a BSD. AIX a HP-UX jsou velmi kompatibilní a nezpůsobují problémy. bash je malý svět sám o sobě.

Doporučil bych Autoconf průvodce přenosným Shell , což je naprosto brilantní a šetří spoustu času. Velké kousky jsou zastaralé, ale to je v pořádku; prostě přeskočte TruUnix a Ultrix a tak dále, pokud vám to nezáleží!

38
Nicholas Wilson

Můžete použít ShellCheck (GitHub) jako ukazatel pro vaše skripty Shell. K dispozici je také online verze .

Chcete-li zjistit problémy s kompatibilitou POSIX (např. SC2039 ), měla by být řádek Shebang vašeho skriptu Shell #!/bin/sh. Můžete také předat --Shell=shshellcheck.

Příklad (test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Výsledek (shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.
33
johnLate

Bash se spustí v režimu kompatibilním s POSIX, pokud je nastavena proměnná prostředí POSIXLY_CORRECT. Z manpage:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          Shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the Shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

Mnoho dalších GNU nástrojů bude také ctít POSIXLY_CORRECT, Takže pokud jste v systému s převážně GNU nástroji (např. Většina systémů Linux), je to dobrý začátek, pokud je vaším cílem Soulad POSIX.

12
James Sneeringer