Mitä he tekevät bash-shebangissa?

Minulla on bash-komentosarja, jolla on seuraava sisältö:

#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi 

Tätä komentosarjaa ei juosta ilman -e. Mitä -e tekee tälle skriptille? Lisäksi mitä $? tekee tässä yhteydessä?

Kommentit

  • Pariton. Ei -e -sivua man-sivulla (haluan todella nähdä vastauksen osoitteen tähän). $? sisältää viimeisen poistumiskoodin (yllä syntyneen egrep -prosessin).
  • @pst: -e on dokumentoitu kohtaan set.
  • Voit yksinkertaistaa komentosarjaasi seuraavasti: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' puuttuu välilyönti if ja [. Tämä komentosarja ' ei toimi kanssa -e, koska jos grep ei löydä ' t mitään, niin komentosarja lopetetaan -e -kohdasta. Ilman -e, olet ' saanut viestin taaksepäin: tila ($?) 0 tarkoittaa, että grep löysi käyttäjän. Huomaa, että tämän pitäisi olla muuten `grep ' ^ käyttäjänimi: ' (entä jos siellä on ' toinen käyttäjä, jolla on pidempi nimi?).
  • Onko #/bin/bash -e sama vaikutus kuin #/bin/bash rivillä # 1 ja set -e rivillä # 2?

Vastaa

Viestisi sisältää itse asiassa 2 kysymystä.

  1. Lippu -e kehottaa komentosarjaa poistumaan virheestä. Lisää lippuja

    Jos tapahtuu virhe, se poistuu heti.

  2. $? on viimeisen komennon poistumistila. Linuxissa poistumistila 0 tarkoittaa, että komento onnistui. Mikä tahansa muu tila merkitsisi virhettä.

Näiden vastausten käyttäminen komentosarjassa:

egrep "^username" /etc/passwd >/dev/null 

etsiisi tiedostoa username /etc/passwd -tiedostosta.

  • Jos se löytää sen sitten poistumistila $? on yhtä suuri kuin 0.

  • Jos ei ”Ei löydy siitä, että poistumistila on jokin muu (ei 0). Täällä haluat suorittaa echo "doesn"t exist" osan koodi.

Valitettavasti komentosarjassa on virhe, ja suoritat kyseisen koodin jos käyttäjä on olemassa – vaihda rivi

if [ $? -ne 0 ] 

logiikan saamiseksi oikein.

Kuitenkin jos käyttäjä ei ”t olemassa, egrep palauttaa virheen c ode, ja -e -asetuksen takia kuori poistuu välittömästi kyseisen rivin jälkeen, joten et koskaan saavuta kyseistä koodin osaa.

Kommentit

  • Lisäksi voit saada komentosarjan toimimaan oikein ilman -e korvaamalla kaksi ensimmäistä riviä if egrep "^username" /etc/passwd >/dev/null.
  • Miksi set ei kuitenkaan vaadita? : – /
  • @pst: Koska -e annetaan bashille komentoriviargumenttina. Bash hyväksyy myös kaikki kohdassa set luetellut vaihtoehdot komentorivillä – huomioi käyttöoppaan osan Asetukset ensimmäinen lause sivu.

Vastaa

Kaikki bash-komentorivikytkimet on dokumentoitu man bash.

 -e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell. 

Kommentit

  • Ahh. Etsin sitä miehestä, mutta löysin tärkeimpien argumenttien kohdalla -e tiedostotesteistä ja ei -e. Hieno ote. Miksi set ei kuitenkaan vaadita? : – /

vastaus

Skripti on väärä, koska

egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi 

exit status 0 – tarkoittaa – kaikki on kunnossa, grep-tapauksessa tarkoittaa” OK, löysi merkkijono ”. exit status! = 0 tarkoittaa jotain vikaa, grep: n tapauksessa 1 tarkoittaa ”ei löydy”, 2 tarkoittaa ”ei voi avata syötettä” …

Vastaa

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