A set -u használat nem a várakozásoknak megfelelően működik

Megtanulom, hogyan lehet hatékonyan használni a különböző set opciókat a szkriptemben és találkoztam a set -u vel, amely tökéletesnek tűnik a szkriptemből való kilépéshez, ha egy változó nincs megfelelően beállítva (pl. felhasználók törlése). A man oldal szerint set -u és set -e a következőket teszi …

-e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting. 

Tesztszkriptet hoztam létre ennek a funkciónak a tesztelésére, de úgy tűnik, hogy nem a várt módon működik . Talán valaki jobban meg tudná magyarázni nekem a kérdésemet, és azt, hogy hol értelmezem rosszul? A teszt szkript alább található. Köszönöm.

set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3} 

Arra számítok, hogy a szkript 0 és “Ez működik” , majd meghiúsul, mivel ${testing2} nincs beállítva.

Ehelyett 0 és “Ez működik” , kövesse 0 , majd 0 Ez nem jelenhet meg

Tud valaki adni némi ismeretet? Köszönöm.

Megjegyzések

  • Tehát követés … van-e valamilyen módszer arra, hogy a null karakterlánc változóját illegálisá tegyük / hibát emeljünk? Én ' nem sejtem.

Válasz

Feladó man Bash “:

Egy paraméter akkor kerül beállításra, ha hozzá van rendelve egy érték. A null karakterlánc érvényes érték. Ha egy változó be van állítva, akkor csak az unset builtin paranccsal állítható vissza.

Ha testing2= a változót null karakterláncra állítja.

Módosítsa unset testing2 értékre, és próbálja újra.


A set -e ebben az esetben nem segít, mivel egy hozzárendelésnek soha nincs 1-es kilépési kódja. Próbálkozzon ezzel, hogy az utoljára végrehajtott parancs (a hozzárendelés) kilépési kódja 0 vagy olvassa el ezt a kérdést :

$ false; a=""; echo $? 0 

És azt is gondolom, hogy a -e halmaz használata inkább egy probléma, amely egy megoldás.

A nem beállított változók használatakor hibát okozhat a set -u:

#!/bin/bash set -u testing="This works" echo ${testing} unset testing2 echo ${testing2} testing3="This should not appear" echo ${testing3} 

Kimenet:

$ ./script.sh This works ./script.sh: line 9: testing2: unbound variable 

Válasz

A testing2= a testing2 változót üres karakterláncra állítja; a változó valójában be van állítva .

Ha azonban a echo $testing99 fájlt futtatnád egy interaktív Bash-héjban (a errexit, azaz set -e) hibaüzenetet kap:

bash: testing99: unbound variable 

Mellette

A szkriptek tesztelése közben rájöttem, hogy egy interaktív shell nem mindig lép ki a amikor olyan változót próbál kibővíteni, amelyet még nem állítottak be , míg egy nem interaktív héj (shell parancsfájlt futtat) mindig kilép . A (z) set POSIX kézikönyve szerint:

-u A shell szabványos hibára ír üzenetet amikor megpróbál kibővíteni egy nem beállított változót, és azonnal kilép. Az interaktív shell nem léphet ki.

Az interaktív Bash shell csak akkor lép ki, ha a errexit is t állítottak be. Másrészt az interaktív kötőjel nem lép ki – még akkor sem, ha set -e korábban futtatásra került.

Megjegyzések

  • Ha a kötőjel nem lép ki a set -e paranccsal; set -u; unset aa; echo $ aa, akkor a kötőjel helytelen.
  • @schily Amikor először észrevettem ezt, arra gondoltam, hogy a kötőjel szerzői jobban tudják, mint én, és hogy a POSIX specifikációiban lehet némi kétértelműség, de újra ellenőrzött pubs.opengroup.org/onlinepubs/9699919799/utilities/… , egyetértek azzal, hogy hibának tűnik, rendben.
  • Van egy egyszerű szabály: amikor Korn Shell és Bourne Shell is egyetértenek, és egy másik shell implementációnál eltérés van, akkor a másik shell helytelenül viselkedik.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük