Testaan erilaisia asioita bash-komentosarjoissa ja törmäsin ongelmaan, johon en voi saada selitystä.

Olen kirjoitetaan tarkoituksella väärä komento, jotta saadaan poistumiskoodi, joka poikkeaa 0: sta, mutta jotenkin näyttää siltä, että saan silti 0.

Koodi, jonka suoritan, on:

USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}" 

Koodini lähtö on:

id: vaihtoehto tuntematon – s

Yritä ”id –help” saadaksesi lisätietoja.

Komennon suorittaminen epäonnistui poistumiskoodilla 0

Käyttäjätunnuksesi on

Oletan, että jollakin tavalla se näyttää kaiku-komennon poistumiskoodin? Jopa, jos poistumiskoodi on 0, miksi se kirjoittaa if-käskyyn?

Jos se on asia, niin miten saan sen näyttämään todellisen poistumiskoodin, joka pitäisi näkyä?

Vastaa

Koodissasi if -lausekkeessa poistumistila, joka saa painettu on testin poistumistila [[ ${?} -ne 0 ]]. Arvo $? on aina viimeksi suoritetun komennon poistumistila, ja testi lasketaan komennona, ainakin siltä osin kuin asetetaan arvon $? sen tulokseen.

Jos haluat tulostaa id -tilan poistumistilan, määritä se muuttujalle, jonka arvo ei muutu,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Kommentit

  • Tämä muu kuin POSIX-komentosarja ei suorita test[[ on osa ksh -syntaksia ja suoritetaan osana tulkkia, mutta ei sisäänrakennettuna Vaikuttaa siltä, että tämä tulkin osa nollaa muistetun poistumiskoodin.
  • Miksi komentosarja kuitenkin suorittaa molemmat echo s? Olisin odottanut sen poistua ensimmäisen jälkeen eikä päästä toiseen.
  • @pericynthion He eivät näytä koodia, jonka he todella juoksivat. Näytettävä lähtö on peräisin version koodistaan ilman exit 1 -lausetta. Se lisättiin todennäköisesti myöhemmin.

Vastaa

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