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
Vastaa
Viestisi sisältää itse asiassa 2 kysymystä.
-
Lippu
-e
kehottaa komentosarjaa poistumaan virheestä. Lisää lippujaJos tapahtuu virhe, se poistuu heti.
-
$?
on viimeisen komennon poistumistila. Linuxissa poistumistila0
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 kuin0
. -
Jos ei ”Ei löydy siitä, että poistumistila on jokin muu (ei
0
). Täällä haluat suorittaaecho "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 kohdassaset
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ä” …
-e
-sivua man-sivulla (haluan todella nähdä vastauksen osoitteen tähän).$?
sisältää viimeisen poistumiskoodin (yllä syntyneenegrep
-prosessin).-e
on dokumentoitu kohtaanset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
ja[
. Tämä komentosarja ' ei toimi kanssa-e
, koska josgrep
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?).#/bin/bash -e
sama vaikutus kuin#/bin/bash
rivillä # 1 jaset -e
rivillä # 2?