Oppin käyttämään erilaisia set
-vaihtoehtoja tehokkaasti komentosarjassa ja löysi set -u
, joka näyttää täydelliseltä poistumaan komentosarjastani, jos muuttujaa ei aseteta oikein (esim. käyttäjien poistaminen). man -sivun mukaan set -u
ja set -e
tekee seuraavat …
-e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting.
Loin testiskriptin testataksesi tätä toimintoa, mutta se ei näytä toimivan odotetulla tavalla . Ehkä joku voisi paremmin selittää ongelmani minulle ja missä tulkitsen väärin? Testiskripti on alla. Kiitos.
set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3}
Odotan komentosarjan näyttävän 0 ja ”Tämä toimii” ja epäonnistuu sitten, kun ${testing2}
on ei asetettu.
Sen sijaan minulle näytetään 0 ja ”Tämä toimii” , seuraa 0 ja sitten 0 Tämän ei pitäisi näkyä
Voiko kukaan antaa tietoa? Kiitos.
Kommentit
- Joten jatkoa … onko mitään keinoa muuttaa muuttujan asettaminen nolla merkkijonoon laitonta / aiheuttaa virhe? En ' arvaa en.
Vastaa
Lähettäjä ” man Bash ”:
Parametri asetetaan, jos sille on annettu arvo. Nolla merkkijono on kelvollinen arvo. Kun muuttuja on asetettu, se voidaan poistaa vain käyttämällä Unset builtin -komentoa.
Kun teet testing2=
asetat muuttujalle nollan merkkijonon.
Muuta arvoksi unset testing2
ja yritä uudelleen.
set -e
ei auta tässä tapauksessa, koska tehtävällä ei ole koskaan lähtökoodia 1. Yritä tätä nähdäksesi, että viimeisimmän suoritetun komennon (tehtävän) poistumiskoodi on 0 tai lue tämä kysymys :
$ false; a=""; echo $? 0
Ja uskon myös, että set -e: n käyttö on enemmän ongelmaa kuin ratkaisu.
Virhe poistamattomien muuttujien käytössä saattaa olla set -u
:
#!/bin/bash set -u testing="This works" echo ${testing} unset testing2 echo ${testing2} testing3="This should not appear" echo ${testing3}
Tulostaa:
$ ./script.sh This works ./script.sh: line 9: testing2: unbound variable
Vastaa
testing2=
asettaa muuttujan testing2
tyhjäksi merkkijonoksi; muuttuja on asetettu .
Jos kuitenkin suoritat echo $testing99
interaktiivisessa Bash-kuoressa (ilman asetusta errexit
eli set -e
), saat virheilmoituksen:
bash: testing99: unbound variable
Lukuun ottamatta
Testatessani komentosarjoja juuri nyt huomasin, että interaktiivinen kuori ei aina poistu yritettäessä laajentaa muuttujaa, jota ei ole asetettu , kun taas ei-vuorovaikutteinen kuori (suorittaa komentosarjakomentosarjaa) poistuu aina . set
-sivuston POSIX-man-sivun mukaan:
-u Kuoren on kirjoitettava viesti normaalivirheelle kun se yrittää laajentaa muuttujaa, jota ei ole asetettu, ja poistua välittömästi. Interaktiivinen kuori ei saa poistua.
Interaktiivinen Bash-kuori ei poistu, ellei errexit
ole myös asetettu. Toisaalta interaktiivinen viiva-kuori ei poistu – vaikka set -e
olisi aiemmin ajettu.
Kommentit
- Jos viiva ei poistu set -e: llä; sarja -u; kuittaamaton aa; echo $ aa, sitten viiva on väärä.
- @schily Kun huomasin tämän ensimmäisen kerran, ajattelin, että viivan kirjoittajat tiesivät paremmin kuin minä ja että POSIX-määrityksissä on saattanut olla jonkin verran epäselvyyttä, mutta ne ovat tarkistettu pubs.opengroup.org/onlinepubs/9699919799/utilities/… , olen samaa mieltä virheestä, kunnossa.
- On olemassa yksinkertainen sääntö: kun sekä Korn Shell että Bourne Shell ovat yhtä mieltä ja toisessa shell-toteutuksessa on poikkeama, toinen kuori käyttäytyy virheellisesti.