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.