set -u -käyttö ei toimi odotetulla tavalla

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *